【问题标题】:Adding events to Form designer file将事件添加到表单设计器文件
【发布时间】:2014-01-24 20:08:49
【问题描述】:

我在我的用户控件 (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);

现在一切正常,但我的问题是为什么它一开始没有自动创建它?据我所知,不建议手动将任何内容添加到设计器文件中。还有其他方法可以做到吗?

谢谢

【问题讨论】:

  • 你的意思是“自动创建”?如果您需要特定事件,则通过 IDE 设计器或代码显式绑定它。您可以在 onload 或 init 事件期间在代码隐藏中绑定事件处理程序,而不是在 Designer.cs 文件中

标签: c# visual-studio-2010 events data-binding user-controls


【解决方案1】:

当您创建事件时,它必须在表单设计器中使用,类似于您在网格中使用 MouseDoubleClick 的方式(因此您需要在 Misc 类别中查找事件,因为您没有'不定义CategoryAttribute,双击那里,等等)。

如果我理解正确,您想在创建表单时自动订阅事件。您可以在控件构造函数(查找父表单control.Parentcontrol.FindForm())中执行此操作,或者在特殊方法中执行此操作,您必须从表单构造函数中调用该方法,这基本上类似于手动连接事件(您在设计器创建的文件中执行,但是,您可以在表单文件中执行,这完全ok可以编辑)由您决定。

【讨论】:

    【解决方案2】:

    当然。 更好的做法是添加绑定行:
    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.
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-17
      • 2014-06-10
      • 2023-03-25
      相关资源
      最近更新 更多