C# 保存到、文本文件和dataGridView C并从中加载#
我需要能够将数据从dataGridView保存到.txt,然后能够将相同的数据加载回适当的位置。它是数据绑定的 这是我目前掌握的代码。 我可以保存到文件,但它只会将文件中的第一条记录加载到dataGridView中。 非常感谢您的帮助C# 保存到、文本文件和dataGridView C并从中加载#,c#,datagridview,openfiledialog,savefiledialog,databound,C#,Datagridview,Openfiledialog,Savefiledialog,Databound,我需要能够将数据从dataGridView保存到.txt,然后能够将相同的数据加载回适当的位置。它是数据绑定的 这是我目前掌握的代码。 我可以保存到文件,但它只会将文件中的第一条记录加载到dataGridView中。 非常感谢您的帮助 private void LoadButton_Click(object sender, EventArgs e) { if (openFileDialog1.ShowDialog().Equals(DialogResult.OK))
private void LoadButton_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog().Equals(DialogResult.OK))
{
cardlist = new List<Card>();
using (System.IO.StreamReader file = new System.IO.StreamReader(openFileDialog1.FileName))
{
Card newcard = new Card();
newcard.CardName = file.ReadLine();
newcard.NumBorrowed = Convert.ToInt32(file.ReadLine());
cardlist.Add(newcard);
}
dataGridView1.DataSource = cardlist;
}
}
private void SaveButton_Click(object sender, EventArgs e)
{
if (saveFileDialog1.ShowDialog().Equals(DialogResult.OK))
{
using (System.IO.StreamWriter file = new System.IO.StreamWriter(saveFileDialog1.FileName))
foreach (Card currentCard in cardlist)
{
file.WriteLine(currentCard.CardName);
file.WriteLine(currentCard.NumBorrowed);
}
}
}
public class Card
{
public String CardName { get; set; }
public int NumBorrowed { get; set; }
}
private void LoadButton\u单击(对象发送者,事件参数e)
{
if(openFileDialog1.ShowDialog().Equals(DialogResult.OK))
{
cardlist=新列表();
使用(System.IO.StreamReader file=new System.IO.StreamReader(openFileDialog1.FileName))
{
Card newcard=新卡();
newcard.CardName=file.ReadLine();
newcard.numborrow=Convert.ToInt32(file.ReadLine());
卡片列表。添加(新卡);
}
dataGridView1.DataSource=cardlist;
}
}
私有无效保存按钮\u单击(对象发送者,事件参数e)
{
if(saveFileDialog1.ShowDialog().Equals(DialogResult.OK))
{
使用(System.IO.StreamWriter file=new System.IO.StreamWriter(saveFileDialog1.FileName))
foreach(卡片列表中的当前卡片)
{
file.WriteLine(currentCard.CardName);
file.WriteLine(currentCard.numborrow);
}
}
}
公务舱卡
{
公共字符串CardName{get;set;}
公共int numborrow{get;set;}
}
您需要迭代文件中的所有项目
替换此项:
using (System.IO.StreamReader file = new System.IO.StreamReader(openFileDialog1.FileName))
{
Card newcard = new Card();
newcard.CardName = file.ReadLine();
newcard.NumBorrowed = Convert.ToInt32(file.ReadLine());
cardlist.Add(newcard);
}
为此:
int lineCount=0;
string line=string.Empty;
using (System.IO.StreamReader file = new System.IO.StreamReader(openFileDialog1.FileName))
{
Card newcard = new Card();
while((line=file.ReadLine()) != null)
{
if(lineCount == 0)
{
newcard.CardName = line;
lineCount = 1;
}
else if(lineCount == 1)
{
newcard.NumBorrowed = Convert.ToInt32(line);
lineCount = 0;
}
cardlist.Add(newcard);
}
或
int i=0;
foreach(var line in File.ReadLines(openFileDialog1.FileName))
{
Card newcard = new Card();
if(i==0)
{
newcard.CardName = line;
i = 1;
}
else if(i==1)
{
newcard.NumBorrowed = Convert.ToInt32(line);
i=0;
}
cardlist.Add(newcard);
}
请尝试以下代码:
using (System.IO.StreamReader file = new System.IO.StreamReader(openFileDialog1.FileName))
{
string line;
while ((line = file.ReadLine()) != null)
{
Card newcard = new Card();
newcard.CardName = line;
newcard.NumBorrowed = Convert.ToInt32(line);
cardlist.Add(newcard);
}
}
这将导致代码在文件中循环,直到到达空行(即文件末尾)
这将把整行放在CardName
和numborrow
中
要使其正常工作,您需要在每个循环中读取2行,如下所示:
string line;
string line2;
while ((line = file.ReadLine()) != null && (line2 = file.ReadLine()) != null) {
}
然后您可以更正代码:
Card newcard = new Card();
newcard.CardName = line;
newcard.NumBorrowed = Convert.ToInt32(line2);
cardlist.Add(newcard);
或者,您可以更改文件格式,而不是每个信息有两行,您可以使用一个单独的值将其压缩到一行(即,Jake^50
,其中,^
是分隔符)
然后,您只需修改代码,将该行拆分为一个数组,并从中提取值。如果我有我的druthers,我会编写文本文件,每行用一条记录分隔,然后不必担心一条坏行会弄乱下面的所有行,但是对于您当前的结构,这应该可以工作,并且它有一点错误检查
using (StreamReader reader = new StreamReader(openFileDialog1.FileName))
{
bool stillReading = true;
while (stillReading)
{
string card, numBorrowed;
card = reader.ReadLine();
numBorrowed = reader.ReadLine();
if (card != null && numBorrowed != null)
{
int numB;
Card newcard = new Card
{
CardName = card,
NumBorrowed = Int32.TryParse(numBorrowed, out numB) ? numB : 0
};
cardlist.Add(newcard);
}
else
{
stillReading = false;
}
}
}
在LoadButton\u Click函数中,您只读取了文件的两行。尝试循环直到文件结束,就像你在SaveButton_Click函数中所做的一样。我想说的是同样的事情,我当时在想“我很确定这里会有另一个foreach循环……嗯”非常感谢你们两位,在过去的两周里,我一直在开发这个个人windows应用程序,我的大脑都快崩溃了。我应该注意到那个小细节。谢谢你的帮助!亲爱的,你的方法是正确的,但请确保
CardName
和numborrow
@sudhakardipudi没有添加同一行。你是对的,我没有考虑他的文件布局。关于这件事,我将补充回答。