为什么我在dataGridView1中的column1之前的索引0中添加了checkBox后继续获得异常?

时间:2014-06-07 01:30:30

标签: c# .net winforms

在form1的顶部,我做了:

DataGridViewCheckBoxColumn chk;

在构造函数中:

chk = new DataGridViewCheckBoxColumn();
dataGridView1.ScrollBars = ScrollBars.Both;
dataGridView1.AllowUserToAddRows = false;

然后我有这个方法我每隔5秒从一个计时器滴答事件中调用它: 该方法根据正在运行的进程数量向dataGridView1添加行: 在这个方法中,我也调用添加checkBoxes的方法:

void PopulateApplications()
        {
            DoubleBufferedd(dataGridView1, true);



                int rcount = dataGridView1.Rows.Count;
                int rcurIndex = 0;
                foreach (Process p in Process.GetProcesses())
                {

                        try
                        {
                            if (File.Exists(p.MainModule.FileName))
                            {


                                        var icon = Icon.ExtractAssociatedIcon(p.MainModule.FileName);
                                        Image ima = icon.ToBitmap();
                                        ima = resizeImage(ima, new Size(25, 25));
                                        ima = (Image)(new Bitmap(ima, new Size(25, 25)));
                                        String status = p.Responding ? "Running" : "Not Responding";
                                        if (rcurIndex < rcount - 1)
                                        {
                                            dataGridView1.Rows[rcurIndex].Cells[0].Value = ima;
                                            dataGridView1.Rows[rcurIndex].Cells[1].Value = p.ProcessName;
                                            dataGridView1.Rows[rcurIndex].Cells[2].Value = status;
                                        }
                                        else
                                        {
                                            dataGridView1.Rows.Add(ima, p.ProcessName, status);
                                        }
                                        rcurIndex++;



                            }
                        }
                        catch ( Exception e)
                        {
                            string t = "error";
                        }
                }

                if (rcurIndex < rcount - 1)
                {
                    for (int i = rcurIndex; i < rcount - 1; i++)
                    {
                        dataGridView1.Rows.RemoveAt(rcurIndex);
                    }
                }


            int f = dataGridView1.Rows.GetRowsHeight(System.Windows.Forms.DataGridViewElementStates.None);
            firsttime += 1;
            if (firsttime == 1)
            {
                NumberOfRows = dataGridView1.Rows.Count;
                AddCheckBox();
            }
            if (NumberOfRows != dataGridView1.Rows.Count)
            {
                int diff = dataGridView1.Rows.Count - NumberOfRows;
                NumberOfRows = dataGridView1.Rows.Count;
            }



        }

问题是当我从PopulateApplications()方法调用此方法时,在dataGridView1中第一个column1之前的左侧添加checkBoxes:

private void AddCheckBox()
        {
            dataGridView1.Columns.Insert(0, chk);
            chk.HeaderText = "Check Data";
            chk.Name = "chk";

        }

一旦我添加了此复选框,我每5秒钟会弹出一次此异常:

enter image description here

为什么我在添加checkBox后会出现此异常?

如果我不打电话给这种方法添加复选框,我就不会得到任何异常。 我试图从form1构造函数调用方法AddCheckBox()但是然后没有任何行,所以我得到错误。这就是我通过PopulateApplications()方法调用AddCheckBox方法的原因。

修改

将方法中的代码更改为:

if (rcurIndex < rcount - 1)
                                        {
                                            var currentRow = dataGridView1.Rows[rcurIndex];
                                            currentRow.Cells[0].Value = true;  // or false for unchecked
                                            currentRow.Cells[1].Value = ima;
                                            currentRow.Cells[2].Value = p.ProcessName;
                                            currentRow.Cells[3].Value = status;
                                        }
                                        else
                                        {
                                            dataGridView1.Rows.Add(true, ima, p.ProcessName, status);
                                        }
                                        rcurIndex++;

现在我得到了这个例外:

enter image description here

1 个答案:

答案 0 :(得分:1)

我无法看到您添加初始DataGridView列的位置,但是来自以下代码:

if (rcurIndex < rcount - 1)
{
    dataGridView1.Rows[rcurIndex].Cells[0].Value = ima;
    dataGridView1.Rows[rcurIndex].Cells[1].Value = p.ProcessName;
    dataGridView1.Rows[rcurIndex].Cells[2].Value = status;
}
else
{
    dataGridView1.Rows.Add(ima, p.ProcessName, status);
}

看起来你有三列开始 - 一个是Image或Bitmap,然后是两个字符串。

但是在现有列之前插入DataGridViewCheckBoxColumn(布尔值)。

现在当你执行上面的代码时,它会尝试在CheckBox列中推送Bitmap值,然后在Bitmap列中推送第一个字符串值,等等。

我不知道该建议什么,因为我无法准确地告诉你打算用CheckBox做什么,但是你需要修改上面的代码来插入一个布尔值(选中或取消选中)到首先,该列已添加到DataGridView

if (rcurIndex < rcount - 1)
{
    var currentRow = dataGridView1.Rows[rcurIndex];
    currentRow.Cells[0].Value = true;  // or false for unchecked
    currentRow.Cells[1].Value = ima;
    currentRow.Cells[2].Value = p.ProcessName;
    currentRow.Cells[3].Value = status;
}
else
{
    dataGridView1.Rows.Add(true, ima, p.ProcessName, status);
}