Почему я продолжаю получать исключения после добавления флажков в индексе 0 до column1 в dataGridView1?

В верхней части формы 1 я сделал:

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(), который добавляет флажки слева от первого столбца 1 в dataGridView1:

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

        }

Как только я добавляю этот флажок, я получаю это всплывающее окно исключения каждые 5 секунд:

Почему я получаю это исключение после добавления флажков?

Если я не вызываю этот метод, который добавляет флажки, я не получаю никаких исключений / с. Я попытался вызвать метод AddCheckBox () из конструктора form1, но тогда еще нет никаких строк, поэтому я получаю ошибку. Вот почему я вызываю метод AddCheckBox через метод PopulateApplications().

РЕДАКТИРОВАТЬ

Изменил код в методе на:

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

Теперь я получаю это исключение:

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

Похоже, у вас есть три столбца для начала - изображение или растровое изображение, а затем две строки.

Но тогда вы вставляете DataGridViewCheckBoxColumn (булево) перед существующими столбцами.

Теперь, когда вы выполните приведенный выше код, он попытается поместить значение Bitmap в столбец CheckBox, затем первое значение строки в столбец 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);
}
Другие вопросы по тегам