Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.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# 保存到、文本文件和dataGridView C并从中加载#_C#_Datagridview_Openfiledialog_Savefiledialog_Databound - Fatal编程技术网

C# 保存到、文本文件和dataGridView C并从中加载#

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))

我需要能够将数据从dataGridView保存到.txt,然后能够将相同的数据加载回适当的位置。它是数据绑定的

这是我目前掌握的代码。 我可以保存到文件,但它只会将文件中的第一条记录加载到dataGridView中。 非常感谢您的帮助

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没有添加同一行。你是对的,我没有考虑他的文件布局。关于这件事,我将补充回答。