我在我的用户控件(SearchControl)中创建了一个新事件,如下所示:
//双击或输入
时触发的事件public event EditRecordEventHandler EditRecord;
public delegate void EditRecordEventHandler(object sender, EventArgs e);
//压制事件
private bool _raiseEvents = true;
private void OnEditRecord(System.EventArgs e)
{
if (_raiseEvents)
{
if (this.SearchResultGridView.FocusedRowHandle > -1)
{
if (EditRecord != null)
{
EditRecord(this, e);
}
}
}
}
现在,当用户双击网格中的一行时,将调用此事件。因此,从属性窗口中,我选择了网格视图的MouseDoubleClick事件,并调用了上面创建的EditRecord事件。
private void SearchResultListGridControl_MouseDoubleClick(object sender, MouseEventArgs e)
{
// Check whether the user clicked on a real and not a header row or group row
DevExpress.XtraGrid.Views.Grid.ViewInfo.GridHitInfo info = SearchResultGridView.CalcHitInfo(e.Location);
if (info.InRow && !SearchResultGridView.IsGroupRow(info.RowHandle))
{
OnEditRecord(e);
}
}
现在我面临的问题是,每当我双击网格视图中的一行时,它会调用SearchResultListGridControl_MouseDoubleClick(),然后调用OnEditRecord(),但EditRecord的值每次都为null。
为了解决这个问题,我检查了具有SearchControl的主控制器的设计器文件,但在此中找不到EditRecord事件条目。所以我手动创建它:
this.MySearchControl.EditRecord += new performis.BA.Merkmalsleisten.Search.SearchControl.EditRecordEventHandle(this.MySearchControl_EditRecord);
现在一切正常,但我的问题是它为什么不首先自动创建它?到目前为止,我知道不建议手动将任何东西添加到设计器文件中。还有其他任何方法可以做到吗?
由于
答案 0 :(得分:1)
当您创建事件时,必须在表单设计器中使用它,类似于您使用MouseDoubleClick
进行网格的方式(因此您需要在 Misc 类别中查找事件,因为你没有定义CategoryAttribute
,双击那里等等。)
如果我理解正确您想要自动订阅活动,那么在创建表单时。您可以在控件构造函数(查找父窗体control.Parent
或control.FindForm()
)中执行此操作,也可以在特殊方法中执行此操作,您必须从窗体构造函数调用它,而这种方法基本上类似于布线事件手动(你在设计师创建的文件中做了,但是,你可以在表单文件中完成,完全 ok 进行编辑)直到你。
答案 1 :(得分:0)
不确定。
更好的做法是添加绑定线:
this.MySearchControl.EditRecord += new performis.BA.Merkmalsleisten.Search.SearchControl.EditRecordEventHandle(this.MySearchControl_EditRecord);
到表单的构造函数。类似的东西:
公共MyForm() {this.MySearchControl.EditRecord += new performis.BA.Merkmalsleisten.Search.SearchControl.EditRecordEventHandle(this.MySearchControl_EditRecord);
//The rest of your constructor.
}