很多时候,我需要在 DataGridView 元素中默认显示一个垂直滚动条。出于这些目的,我对标准控件使用了一个简单的扩展器。
internal partial class CustomDataGridView : DataGridView
{
internal CustomDataGridView() : base()
{
this.VerticalScrollBar.Visible = true;
this.VerticalScrollBar.VisibleChanged += new EventHandler(VerticalScrollBar_VisibleChanged);
}
internal void VerticalScrollBar_VisibleChanged(object sender, EventArgs e)
{
if (!this.VerticalScrollBar.Visible)
{
this.VerticalScrollBar.Location = new Point(this.ClientRectangle.Width - this.VerticalScrollBar.Width - 1, 1);
this.VerticalScrollBar.Height = this.ClientRectangle.Height - 2;
this.VerticalScrollBar.Width = this.VerticalScrollBar.Width;
this.VerticalScrollBar.Show();
}
}
}
我最近注意到,当 CustomDataGridView 被重新填充时,不知从哪里弹出一条消息。发生的频率是不可预测的。它可以毫无问题地更新 20 次,或者它可以在第一次更新时发出这个:
控制代码本身如下:
public void writeNameTable(NameTable NameTable)
{
if (InvokeRequired)
{
BeginInvoke(new writeNameTableDelegate(writeNameTable), new object[] { NameTable });
return;
}
this.dataGridView1.Rows.Clear();
NAME_TABLE = NameTable.NAMES;
for (int i = 0; i < NAME_TABLE.Length; i++)
{
this.dataGridView1.Rows.Add(1);
int index = this.dataGridView1.Rows.GetLastRow(DataGridViewElementStates.Visible);
this.dataGridView1.Rows[index].Cells[0].Value = i.ToString();
this.dataGridView1.Rows[index].Cells[1].Value = NAME_TABLE[i].Name;
this.dataGridView1.Rows[index].Cells[2].Value = ((ObjectFlags)NAME_TABLE[i].ObjectFlag).ToString();
}
}
问题:如何捕获/修复这样的异常?
StackOverflowException
不可能抓住。当当前线程由于堆栈溢出而无法再运行时,会发生此异常。也就是说,这个异常在任何情况下都会导致应用程序崩溃。能做的就是修复代码,这样就不会出现这种异常了。要分析异常的原因,研究堆栈跟踪,应该有一个递归调用链,这将有助于理解原始原因。
异常的原因可能是同一事件的另一个处理程序
VisibleChanged
执行与此或父控件的当前处理程序相反的操作。我不建议更改Visible
此处理程序,我认为没有理由调用Show()
.你有这样的递归
如果您调用此示例中的任何方法,
StackOverflowException
.