сохранение и загрузка из текстового файла и dataGridView C#

Мне нужна возможность сохранять данные из 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; }
    } 

person BPratt93    schedule 14.03.2014    source источник
comment
Вы читаете только две строки вашего файла в своей функции LoadButton_Click. Попробуйте выполнить цикл, пока не дойдете до конца файла, подобно тому, как вы делаете это в своей функции SaveButton_Click.   -  person B L    schedule 14.03.2014
comment
Хотел сказать то же самое, я смотрел на это, думая, что я почти уверен, что там должен быть еще один цикл foreach .... хммм   -  person JBurnham    schedule 14.03.2014
comment
Большое спасибо вам обоим, я провел последние 2 недели, работая над этим личным приложением для Windows, и мой мозг поджарился. Я должен был заметить эту маленькую деталь. Спасибо за помощь!   -  person BPratt93    schedule 14.03.2014


Ответы (3)


Вам нужно перебрать все элементы в файле

Замените это:

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);
}
person Sudhakar Tillapudi    schedule 14.03.2014

Попробуйте следующий код:

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 и NumBorrowed.

Чтобы это работало правильно, вам нужно либо прочитать 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, где ^ — разделитель).

Затем вам нужно просто изменить код, чтобы разделить строку на массив и извлечь из него значения.

person Nunners    schedule 14.03.2014
comment
дорогой, ваш подход правильный, но, пожалуйста, убедитесь, что одна и та же строка не добавляется как к CardName, так и к NumBorrowed. - person Sudhakar Tillapudi; 14.03.2014
comment
@SudhakarTillapudi Вы правы, я не думал о его макете файла. Я добавлю к ответу об этом. - person Nunners; 14.03.2014

Если бы у меня были свои барабанщики, я бы написал свой текстовый файл с разделителями одной записью в строке, а затем не беспокоился бы о том, что 1 плохая строка испортит все следующие строки, но с вашей текущей структурой это должно работать, и у него есть небольшая проверка ошибок .

        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;
                }
            } 
        }
person safetyOtter    schedule 14.03.2014