转自:http://blog.163.com/qiaoqiaoyouxiang@126/blog/static/13260743120106281047324/
谢谢原创,留作学习参考。
在DataGridView中,选择行无法隐藏的问题!
当直接用程序中的 DataGridView.SelectRows[0].Visible = false; 程序会报出一个异常!
异常错误如下:System.InvalidOperationException: 与货币管理器的位置关联的行不能设置为不可见。
在这里可以看出明显是数据绑定问题,就是货币管理器的问题:这下问题好解决了;
CurrencyManager:货币管理类,通过如下方法可以获取。在CurrencyManager中有2个方法
SuspendBinding(),ResumeBinding()(详细资料可以查询MSDN)
CurrencyManager cm = (CurrencyManager)BindingContext[DataGirdView.Source];
cm.SuspendBinding(); 挂起数据绑定
.........
DataGridView.SelectedRows[0].Visible = false;
.........
cm.ResumeBinding(); 恢复数据绑定
*********************************
我的代码是:
DataGridViewHelper.TryGetCellValue<string>(dataGridViewRightCert.Rows[0], "ACTIVEID", ref ActiveID);
DataGridViewHelper.TryGetCellValue<string>(dataGridViewRightCert.Rows[0], "CANCELACTIVEID", ref CancelActiveID);
DataGridViewHelper.TryGetCellValue<DateTime>(dataGridViewRightCert.Rows[0], "CERTCREATEDATE", ref CertData); //取得现在证书的日期
DateStor = CertData;
DataGridViewHelper.BandData(dataGridViewRightCert, string.Format(TableViewFormat2, "2,4", ""), "BLDROOMID=" + BldRoomID + " order by CERTCREATEDATE");
//遍历找date,存数组。
count = dataGridViewRightCert.RowCount;
Datearray = new DateTime[count];
CurrencyManager cm = (CurrencyManager)BindingContext[dataGridViewRightCert.DataSource];
for(int i = 0; i< count;i++)
{
DataGridViewHelper.TryGetCellValue<DateTime>(dataGridViewRightCert.Rows[i], "CERTCREATEDATE", ref CertData);
cm.SuspendBinding(); //挂起数据绑定
dataGridViewRightCert.Rows[i].Selected = false;
dataGridViewRightCert.Rows[i].Visible = false;
Datearray[i] = CertData;
if(Datearray[i] == DateStor )
Cur_index = i;
}
Crule = Cur_index;
dataGridViewRightCert.Rows[Cur_index].Selected = true;
dataGridViewRightCert.Rows[Cur_index].Visible = true;
cm.ResumeBinding(); //恢复数据绑定
buttonRightCertPre.Enabled = true;
buttonRightCertNxt.Enabled = true;
dataGridViewRightCert.Refresh();
其中,如果不用上述方法,就会报错。或者另一个解决办法是rowfilter。参见: