Почему я продолжаю получать исключения после добавления флажков в индексе 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);
}