C# C Windows窗体搜索txt文件以查找传递的数据并传递到文本框
我对C比较陌生,花了大量时间试图自己解决这个问题,但运气不佳。希望你们能帮忙 我有两张windows窗体。在第一种形式中,用户输入引用编号。我想获取引用号,在外部文本文件中搜索它,然后将该引用行中的所有数据返回到单独的文本框中 文本文件如下所示: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
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等?