Проблемы с DataGridView в C# Winforms

У меня проблема с DataGridView.

Во-первых, как видите:
я переношу информацию из массива DataGridView в массив Info_Goods. Я его внимательно проверил, он полностью передал всю нужную мне информацию.

Но когда я использую foreach для записи информации массива Info_Goods в text.txt, записывается только информация первой строки. Я создал другой массив, имя testArray с некоторыми элементами, созданными до

пример:

string[,] testArray = {{a,b,c}, {d,e,f}};

Он полностью записал информацию из testArray. Я не знаю, что случилось.

string Name = "";
Name = tb_Name.Text;

string[,] Info_Goods = new string[50, 50];

int Number = 1;

for (int i = 0; i < dgv_Input.Rows.Count - 1; i++)
{
  for (int j = 0; j < dgv_Input.Columns.Count - 1; j++)
  {
    Info_Goods[i, j] = dgv_Input.Rows[i].Cells[j].Value.ToString();
  }
}

////================================ Write File 
 // string[,] test = { { "a", "b", "c" }, { "d", "e", "f" } };  // it worked
using (System.IO.StreamWriter sw = new System.IO.StreamWriter(Number.ToString() + " " + Name + ".txt"))
{
  foreach (string s in Info_Goods)      // it didn't worked
  {
    sw.WriteLine(s);
  }
}

Во-вторых, я хочу проверить пустые элементы в DataGridView и показать уведомление об ошибке.

Как видите, я использую такой же цикл, как и при передаче информации из DataGridView в массив Info_Goods.

Я использовал 1 проверочную переменную (1: пустые элементы и 0: не пустые). это не сработало

Но когда я написал только оператор IF (без использования циклов), он сработал.

int check = 0;

for (int a = 0; a < dgv_Input.Rows.Count - 1; a++)
{
  for (int b = 0; b < dgv_Input.Columns.Count - 1; b++)
  {
    if (string.IsNullOrEmpty(dgv_Input.Rows[a].Cells[b].Value as string))   // it didn't work
    {
      check = 1;
    }
  }
}
// if (string.IsNullOrEmpty(dgv_Input.Rows[0].Cells[0].Value as string)) // it worked

person Thang Nguyen    schedule 21.02.2017    source источник


Ответы (2)


Для вашего первого кода непонятно, почему вы используете массив строк [50,50]? DataGridView dgv_Input может показаться лучшим способом определения размера массива. Или еще лучше использовать список. Использование массива так, как вы, создаст нулевые значения для многочисленных элементов в массиве или возможное переполнение. Допустим, в dgv_Input есть 4 столбца и 5 строк данных. Массив string[50,50] будет выглядеть следующим образом после того, как вы прочитаете ячейки в массив, как это делает код:

[0,0] data0 col1
[0,1] data0 col2
[0,2] data0 col3
[0,3] data0 col4
[0,4] null
[0,5] null
[0,6] null
   …….
[0,47] null
[0,48] null
[0,49] null
[1,0] data1 col1
[1,1] data1 col2
[1,2] data1 col3
[1,3] data1 col4
[1,4] null
[1,5] null
[1,6] null

Это явно много потраченного впустую места и гарантия нулевых значений/строк. Когда вы пытаетесь записать этот массив в файл, вы должны проверить эти нулевые значения с помощью:

If (s != null)…

Возможно, вы захотите переосмыслить, как вы хотите хранить строки из DataGridView… Я предполагаю, что по 1 строке для каждой строки и, возможно, сохраните их в List, поскольку вы можете не знать, сколько их здесь.

Что касается вашей второй проблемы, я предполагаю, что проблема связана со следующей строкой кода:

string.IsNullOrEmpty(dgv_Input.Rows[a].Cells[b].Value as string)

Я не думаю, что это возвращает то, что вы ожидаете. Во-первых, есть большая вероятность, что dgv_Input.Rows[a].Cells[b].Value может быть нулевым. Я знаю, что строка, кажется, спрашивает, является ли STRING нулевым значением IsNullOrEmpty. Также строка выше вернет true, если значение в ячейке DataGridView является числом. Другими словами, строка выше не работает должным образом. Ниже я разбил код, чтобы проверить, какие значения являются нулевыми, а какие — пустыми строками. Похоже, это работает так, как ожидалось

for (int a = 0; a < dataGridView1.Rows.Count -1 ; a++) {
  for (int b = 0; b < dataGridView1.Columns.Count; b++) {
    if (dataGridView1.Rows[a].Cells[b].Value != null) {
      if (dataGridView1.Rows[a].Cells[b].Value.ToString() != "") {
        textBox1.Text += dataGridView1.Rows[a].Cells[b].Value.ToString() + ",";
      } else {
       // MessageBox.Show("String is empty: ");
      }
    } else {
      //MessageBox.Show("DGV Cell Value is null: ");
    }
  }
  textBox1.Text += Environment.NewLine;
}
person JohnG    schedule 21.02.2017
comment
следуя тому, как tomato32 дал мне, я исправил эту ошибку 2-й проблемы. Но я очень благодарен за вашу помощь и знания, которыми вы поделились, я просто хочу сказать Спасибо!! - person Thang Nguyen; 21.02.2017

Вы должны изменить цикл, как показано ниже. И тогда он будет работать правильно, мой друг.

for (int i = 0; i < dgv_Input.Rows.Count; i++)
{
  for (int j = 0; j < dgv_Input.Columns.Count; j++)
  {
    Info_Goods[i, j] = dgv_Input.Rows[i].Cells[j].Value.ToString();
  }
}
person Tomato32    schedule 21.02.2017
comment
Я не знаю почему, но это помогло мне решить мою вторую проблему, большое спасибо, братан. Но я думаю, что этот способ не работает с моей 1-й проблемой, потому что в моем представлении данных последний столбец - это кнопка, а последняя строка - пустая строка, поэтому я использовал dgv_Input.Rows.Count - 1 и dgv_Input.Columns.Count - 1 вместо dgv_Input.Rows.Count и dgv_Input.Columns.Count - person Thang Nguyen; 21.02.2017
comment
Вы создаете приложение для редактируемого представления сетки, верно? А потом, когда нажимаешь кнопку, показывать валидацию? - person Tomato32; 21.02.2017
comment
То же самое. Моя идея заключается в том, что если я нажму кнопку, строка будет удалена. Но я построю эту функцию позже. Теперь мне нужно найти способ записать все значения массива Info_Goods в text.txt, потому что он просто записывает только 1 элемент этого массива :(( sosad - person Thang Nguyen; 21.02.2017
comment
Ты пользуешься скайпом? Просто добавьте мой ник, manhtran32. Может поддержу :)) - person Tomato32; 21.02.2017
comment
trời đất người việt à , sao ko dùng tiếng việt luon đi rep comment đi anh :)). Mà em không có máy nên chỉ ra quán code thôi anh ơi - person Thang Nguyen; 21.02.2017