我的搜索表单中有一个datagridview,现在我编写代码来生成 ContextMenuStrip ,当我右键单击某个特定行然后它显示不同的选项时。除非我点击datagridview的空白部分,否则每件事情都可以。它会产生错误
了解更多细节,请考虑下面的图片
当我按下该行时会很好,但是当我点击此行下面的空白部分时出现错误
以下是 MouseClickEvent
的代码 private void SearchPanelDataGridView_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
ContextMenuStrip smenu = new System.Windows.Forms.ContextMenuStrip();
var htest = SearchPanelDataGridView.HitTest(e.X, e.Y);
SearchPanelDataGridView.ClearSelection();
SearchPanelDataGridView.Rows[htest.RowIndex].Selected = true;
smenu.Items.Add("Clear Record").Name = "Clear Record";
smenu.Items.Add("Pay Amount").Name = "Pay Amount";
smenu.Items.Add("Break Apart").Name = "Break Apart";
smenu.Items.Add("View Details").Name = "View Details";
int CurrentMouseOverRow = SearchPanelDataGridView.HitTest(e.X, e.Y).RowIndex;
smenu.Show(SearchPanelDataGridView, new Point(e.X, e.Y));
name = SearchPanelDataGridView.SelectedRows[0].Cells[2].Value.ToString();
cnic = SearchPanelDataGridView.SelectedRows[0].Cells[8].Value.ToString();
fathername = SearchPanelDataGridView.SelectedRows[0].Cells[3].Value.ToString();
City = SearchPanelDataGridView.SelectedRows[0].Cells[10].Value.ToString();
smenu.ItemClicked += new ToolStripItemClickedEventHandler(smenu_ItemClicked);
}
}
答案 0 :(得分:1)
您的方法包含可能发生此异常的几个地方。
首先是以下一行:
SearchPanelDataGridView.Rows[htest.RowIndex].Selected = true;
您的htest.RowIndex
是-1
,因为您在空白区域内点击时没有按任何一行。您应该检查-1
并离开。
如果没有选择任何项目,则可以发生此异常的下一个位置是访问SearchPanelDataGridView.SelectedRows[0]
。因此,您应该查看Count
集合的SelectedRows
。如果是0
则离开。
当通过不在范围内的索引访问Cells
时,也会发生异常。
不要忘记索引以0
开头,以n-1
结尾;)