调用控件事件处理程序

时间:2012-05-15 20:30:48

标签: c# .net datagrid event-handling eventargs

我决定尝试第三方的DataGridView实现,特别是为了利用分层网格,即“网格内的网格”功能。虽然这很好用,但我注意到我在这个实现中不存在我依赖普通DataGridViews的一些事件和属性,并且必须找到实现相同目标的不同方法。

一个这样的目标是,当我使用CheckBoxColumn并且用户“检查”或“取消检查”该框时,我需要在发生时将该更改推送到网格(以及随后的数据库),否则用户必须按Enter键或离开单元格焦点才能实际提交更改....有点不可思议。为了解决这个问题,我利用了'CurrentCellDirtyStateChanged'事件,并手动将检查或取消检查提交到网格,这又触发了我的'CellValueChanged'事件:

void dataGridView_CurrentCellDirtyStateChanged(object  sender, EventArgs  e)
{       
     if ((dataGridView.IsCurrentCellDirty) & (dataGridView.CurrentCell.ColumnIndex == 0))
     {
          dataGridView.CommitEdit(DataGridViewDataErrorContexts.Commit);
     }
}

但是,第三方网格不存在此事件,CommitEdit方法也不存在。为了实现相同的功能,我最终不得不这样做:

void GridView_ValueChanged(object sender, EventArgs  e) 
{ 

     if(sender.GetType().ToString().Contains("RadCheckBoxEditor"))
     {       
        RadCheckBoxEditor rad_chb = (RadCheckBoxEditor)sender;
        GridCheckBoxCellElement checked_a_box = (GridCheckBoxCellElement)rad_chb.OwnerElement;

        checked_a_box.Value = rad_chb.Value;

        GridViewCellEventArgs new_args = new GridViewCellEventArgs(checked_a_box.RowInfo, checked_a_box.ColumnInfo, checked_a_box.Editor);

        GridView_CellValueChanged(checked_a_box, new_args);

     }
     else
     {
         return;
     }


}

我基本上捕获了脏值,将其分配给'CellValueChanged'处理程序可识别的类型的值,定义了我自己的事件args,并显式调用了句柄。这样的东西有没有潜在的气味?这只是感觉不对。我注意到其他人建议创建一个独立的函数来访问共享代码,但是,这些示例似乎并不依赖于推送事件的特定事件。

0 个答案:

没有答案