我看到复选框有一个CheckedChanged事件.是否可以判断是否以编程方式更改,或者由用户实际检查复选框?
我有一个大型网格,用户可以在其中输入过滤器,或者使用一些提供常见过滤参数的“快速过滤器”复选框.然后说他们去通过文本框修改过滤器,我正在检查是否应该以编程方式(un)检查CheckBox控件,以便它反映在文本框中的过滤器.
private void genericCheckBox_CheckedChanged(object sender,EventArgs e) { UpdateFilter(); } private void UpdateFilter() { if (gdcSVNDefaultView.RowCount == 0) return; gdcSVNDefaultView.ActiveFilterString = BuildTableFilter(); gdcSVNDefaultView.BestFitColumns(); } private void gdcSVNDefaultView_ColumnFilterChanged(object sender,EventArgs e) { lblTotalFileCount.Text = gdcSVNDefaultView.RowCount.ToString(); if (gdcSVNDefaultView.ActiveFilterString.Contains("Normal")) cheNormalFiles.Checked = true; else cheNormalFiles.Checked = false; if (gdcSVNDefaultView.ActiveFilterString.Contains("bin") || gdcSVNDefaultView.ActiveFilterString.Contains("obj")) cheBinObjFolders.Checked = true; else cheBinObjFolders.Checked = false; }
通过一些非常轻的测试,这似乎就像我想要的那样工作.但是担心CheckedChanged事件发生时调用UpdateFilter方法会导致ColumnFilterChanged事件触发,这可能会导致CheckedChange再次发生,因为ColumnFilterChanged操作了复选框.
解决方法
我可能会分离,然后重新连接处理程序,例如
private void gdcSVNDefaultView_ColumnFilterChanged(object sender,EventArgs e) { cheNormalFiles.CheckedChanged -= genericCheckBox_CheckedChanged; cheBinObjFolders.CheckedChanged -= genericCheckBox_CheckedChanged; // do stuff... cheNormalFiles.CheckedChanged += genericCheckBox_CheckedChanged; cheBinObjFolders.CheckedChanged += genericCheckBox_CheckedChanged; }