Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C Windows窗体搜索txt文件以查找传递的数据并传递到文本框_C#_Arrays_Winforms_Multidimensional Array - Fatal编程技术网

C# C Windows窗体搜索txt文件以查找传递的数据并传递到文本框

C# C Windows窗体搜索txt文件以查找传递的数据并传递到文本框,c#,arrays,winforms,multidimensional-array,C#,Arrays,Winforms,Multidimensional Array,我对C比较陌生,花了大量时间试图自己解决这个问题,但运气不佳。希望你们能帮忙 我有两张windows窗体。在第一种形式中,用户输入引用编号。我想获取引用号,在外部文本文件中搜索它,然后将该引用行中的所有数据返回到单独的文本框中 文本文件如下所示: S8729936 , 6JXV123 , 10/1/2015 , 10/31/2015 , PAID , 49.5 A7472601 , 2NXP234 , 10/12/2015 , 11/11/2015 , UNPAID , 99 W2041810

我对C比较陌生,花了大量时间试图自己解决这个问题,但运气不佳。希望你们能帮忙

我有两张windows窗体。在第一种形式中,用户输入引用编号。我想获取引用号,在外部文本文件中搜索它,然后将该引用行中的所有数据返回到单独的文本框中

文本文件如下所示:

S8729936 , 6JXV123 , 10/1/2015 , 10/31/2015 , PAID , 49.5
A7472601 , 2NXP234 , 10/12/2015 , 11/11/2015 , UNPAID , 99
W2041810 , 5JPB345 , 10/19/2015 , 11/18/2015 , UNPAID , 99
public void SetCitation(Citation citation)
{
    this.citationBindingSource.DataSource = citation;
}
        //output
        foreach (string s in matchedList)
        {
            string citationLine = s;
            string[] lineData = citationLine.Split(',');
            txtLicense2.Text = lineData[1];
            txtIssued2.Text = lineData[2];
            txtDue2.Text = lineData[3];
            txtStatus2.Text = lineData[4];
            txtAmount2.Text = lineData[5];
        }
第二个表单有6个文本框。我有它,所以引用号,比如说S8729936被传递到第一个文本框中,但我似乎不知道如何在文本文件中搜索S8729936,并在文本框中给我行中的其余数据

下面是一些我尝试过的例子。我整天都在复制和粘贴代码,然后把代码弄得一团糟,所以如果细节不匹配,那可能就是原因

public Form2(string citation)
    {
        InitializeComponent();
        txtCitation2.Text = citation;

        const string FILENAME = @"\Path\ProjectData.txt";
        FileStream fsInFile = new FileStream(FILENAME, FileMode.Open, FileAccess.Read);
        StreamReader srReader = new StreamReader(fsInFile);

        const char CH_DELIM = ',';
        string strRecordIn;
        string[] strFields;

        if (strFields != null)
        {
            strRecordIn = srReader.ReadLine();
            strFields = strRecordIn.Split(CH_DELIM);
            txtLicense2.Text = strFields[1];
        }
strRecordIn = srReader.ReadLine();

        srReader.Close();
        fsInFile.Close();
    }
没什么好运气的,来点类似的吧:

string whole_file = File.ReadAllText(@"Path\ProjectData.txt");
        whole_file = whole_file.Replace('\n', '\r');
        string[] lines = whole_file.Split(new char[] { '\r' });

        int num_rows = lines.Length;
        int num_cols = lines[0].Split(',').Length;

        string[,] values = new string[num_rows, num_cols];

        for (int r = 0; r < num_rows; r++)
        {
            string[] line_r = lines[r].Split(',');
            for (int c = 0; c < num_cols; c++)
            {
                values[r, c] = line_r[c];
            }
        }

        txtLicense2.Text = lines[1];
const string FILENAME = @"C:\Users\rfranklin\Documents\ProjectData.txt";
        FileStream fsinfile = new FileStream(FILENAME, FileMode.Open, FileAccess.Read);
        StreamReader srReader = new StreamReader(fsinfile);

        const string CH_DELIM = " ,";
        string strRecordIn;
        string[] strFields = new string[10];
        string citnum = citation;
        bool found = false;

        strRecordIn = srReader.ReadLine();

        foreach(string x in strFields)
        {
            if (x == citation)
            {
                found = true;
                break;
            }
        }

        if (found)
        {
            txtLicense2.Text = strFields[1];
        }
还是不走运。不断地。似乎我几乎不知道如何告诉程序要搜索什么,我也不知道还能做什么。就像我说的,我一整天都在用谷歌搜索各种各样的方法来做这件事,但我似乎无法让任何事情正常进行

如果这有帮助的话,我将在Visual Studio 2013中这样做


任何帮助都将不胜感激。谢谢。

如果CSV文件中的行数不是太大,我不知道什么太大,那么您可以利用一些.NET构造,例如数据绑定和Linq来实现这一点

对于初学者,我将创建一个实现INotifyPropertyChanged的类:

此类负责从CSV文件中拆分一行,并将其转换为引文类型的对象,该对象稍后将用于数据绑定Form2中的文本框

然后在第一种形式中,我只需读取文件,并使用一些Linq运算符,将文件转换为引文对象字典,字典的键是引文编号:

private void button1_Click(object sender, EventArgs e)
{
    string[] allLines = File.ReadAllLines("Citations.csv");

    Dictionary<string, Citation> dict = allLines.Select(l => Citation.ParseLine(l)).ToDictionary(c => c.CitationNumber, k => k);

    Citation cit = dict["W2041810"];

    Form2 frm2 = new Form2();
    frm2.SetCitation(cit);
    frm2.ShowDialog();
}
Form2的代码有点难以显示,因为我已经使用Form designer为每个文本框设置了数据绑定,如果我想显示,我基本上必须显示整个Form2.designer.cs文件

相反,我建议引导您完成创建项目数据源的过程,然后从VisualStudio的“数据源”对话框中将文本框拖放到Form2上

因此,在将引文类添加到解决方案后,请确保立即编译,以便“添加数据源”向导将该类作为可能的数据源

然后,在此处转到“查看>其他窗口>数据源”(假设使用Visual Studio 2015),确保显示“数据源”对话框

在“数据源”对话框中,单击“添加新数据源”按钮以启动数据源配置向导。从可能的数据源列表中,您将选择对象:

然后单击下一步按钮。在向导的下一步中,您将选择引文类:

然后单击Finish按钮

在“数据源”对话框中,现在应该有如下内容:

S8729936 , 6JXV123 , 10/1/2015 , 10/31/2015 , PAID , 49.5
A7472601 , 2NXP234 , 10/12/2015 , 11/11/2015 , UNPAID , 99
W2041810 , 5JPB345 , 10/19/2015 , 11/18/2015 , UNPAID , 99
public void SetCitation(Citation citation)
{
    this.citationBindingSource.DataSource = citation;
}
        //output
        foreach (string s in matchedList)
        {
            string citationLine = s;
            string[] lineData = citationLine.Split(',');
            txtLicense2.Text = lineData[1];
            txtIssued2.Text = lineData[2];
            txtDue2.Text = lineData[3];
            txtStatus2.Text = lineData[4];
            txtAmount2.Text = lineData[5];
        }
从这个“数据源”对话框中,您现在可以将各个字段拖放到Form2上,这将为您提供如下信息:

S8729936 , 6JXV123 , 10/1/2015 , 10/31/2015 , PAID , 49.5
A7472601 , 2NXP234 , 10/12/2015 , 11/11/2015 , UNPAID , 99
W2041810 , 5JPB345 , 10/19/2015 , 11/18/2015 , UNPAID , 99
public void SetCitation(Citation citation)
{
    this.citationBindingSource.DataSource = citation;
}
        //output
        foreach (string s in matchedList)
        {
            string citationLine = s;
            string[] lineData = citationLine.Split(',');
            txtLicense2.Text = lineData[1];
            txtIssued2.Text = lineData[2];
            txtDue2.Text = lineData[3];
            txtStatus2.Text = lineData[4];
            txtAmount2.Text = lineData[5];
        }
您还将注意到,在Form2的组件托盘中添加了BindingSource对象:

在后台,VisualStudio将为引文对象属性设置所有数据绑定,以显示在相应的文本框中

这是一种粘合剂,它可以使用引文对象调用Form2.Set引文,并将所有字段显示在它们应该显示的位置

我知道这是一个相当多的咀嚼,但相信我,一旦你明白了背后的原则,你不会想回到那种你开始实施的spagethi代码没有冒犯,我们都有过

如果你想让我澄清我答案中的任何具体部分,请告诉我,我会相应地进行编辑


干杯

简单的winForm版本:

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.IO;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        List<string> matchedList = new List<string>();

        public Form1(string citation)
        {
            InitializeComponent();

            string filePath = @"C:\Users\rfranklin\Documents\ProjectData.txt";
            string[] linesArr = File.ReadAllLines(filePath);

            //find matches
            foreach(string s in linesArr)
            {
                if(s.Contains(citation))
                {
                    matchedList.Add(s); //matched
                }
            }

            //output
            foreach(string s in matchedList)
            {
                Console.WriteLine(s); //write to console
                //or output to wherever you wish, eg.
                //richTextBox.Text += s + "\n";
            }
        }
    }
}

风的建议帮了我。在他提供的代码的//output部分中,我基本上只是从匹配行创建了第二个数组,元素之间用逗号分隔。代码如下所示:

S8729936 , 6JXV123 , 10/1/2015 , 10/31/2015 , PAID , 49.5
A7472601 , 2NXP234 , 10/12/2015 , 11/11/2015 , UNPAID , 99
W2041810 , 5JPB345 , 10/19/2015 , 11/18/2015 , UNPAID , 99
public void SetCitation(Citation citation)
{
    this.citationBindingSource.DataSource = citation;
}
        //output
        foreach (string s in matchedList)
        {
            string citationLine = s;
            string[] lineData = citationLine.Split(',');
            txtLicense2.Text = lineData[1];
            txtIssued2.Text = lineData[2];
            txtDue2.Text = lineData[3];
            txtStatus2.Text = lineData[4];
            txtAmount2.Text = lineData[5];
        }

这使我能够将数据放入所需的文本框中。谢谢大家的帮助

您需要循环文件内容。您只是在阅读第一行并处理它。您需要将ReadLine放入循环中。文件中有多少行?您是否可以控制此文件的格式,或将其作为CSV提供给您?是否有可能将其转换为数据库表访问、MS SQL等?