C#Winforms中DataGridView的问题

时间:2017-02-21 03:19:04

标签: c# winforms datagridview

我遇到了DataGridView的问题。

首先,你可以看到:
我将信息从DataGridView传输到Info_Goods阵列。 我仔细检查过,它完全转移了我需要的所有信息。

但是当我使用foreachInfo_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

2 个答案:

答案 0 :(得分:0)

您应该如下修改循环。然后它会正常运行,我的朋友。

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();
  }
}

答案 1 :(得分:0)

对于你的第一个代码,目前还不清楚你为什么使用[50,50]的字符串数组? DataGridView dgv_Input似乎是更好地调整数组大小的方法。或者更好的是使用列表。以您的方式使用数组将为数组中的众多元素创建空值或可能的溢出。假设dgv_Input中有4列和5行数据,在您将代码读入数组后,字符串[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很可能为空。我知道该行似乎在询问是否为空值IsNullOrEmpty的STRING。如果DataGridView单元格中的值是数字,则上面的行将返回true。换句话说,上面的行似乎没有按预期工作。下面我打破了代码,检查哪些值为null或哪些值为空字符串。这似乎按预期工作

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;
}