在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秒钟会弹出一次此异常:
为什么我在添加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++;
现在我得到了这个例外:
答案 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);
}