C#查找发件人

时间:2013-01-01 15:06:32

标签: c# object sender

private void buttonCheck(object sender, EventArgs e)
{
   Type x = sender.GetType();
   var y = Activator.CreateInstance(x); //sends me back to the original problem : sender is an object, not a usable object.

   var x = (Button)sender;  // == button, but you never know what sender is until it's already in this function... so 
   dynamic z = sender; //gives you the image of sender i'm looking for, but it's at runtime, so no intellisense/actual compiletime knowledge of what sender is.
}

如果没有类发件人的事先知识实际上为这种方法带来了什么,你如何创建一个可用的发件人实例呢?

3 个答案:

答案 0 :(得分:5)

在绝大多数情况下知道哪些控件将触发事件,因为(程序员)将它们连接起来。例如,如果您将此事件连接到一个按钮(甚至多个按钮),您知道发件人是Button,因此您可以直接投射:

var b = sender as Button;

var b = (Button)sender;

任何一个都会给你完整的智能感知。

如果您将此事件连接到多个控件类型,最好的办法是检查每种可能的类型:

if(sender is Button)
//  cast to Button
else if (sender is TextBox)
//  cast to TextBox
else is (sender is CobmoBox)
//  cast to ComboBox

它可能看起来很混乱,但是因为你没有在事件处理程序中说明你真正想要的事情,这是在一个事件中处理多个可能的最干净的方式发件人类型。

另一种选择是创建多个事件处理程序(每种类型一个)并将它们连接到各自的类型。我无法想到ButtonTextBox之间的许多代码重用方案。

答案 1 :(得分:0)

我认为动态关键字是您正在寻找的。在编译时,编译器假定btn中有Text属性。

  private void button1_Click(object sender, EventArgs e)
  {
     var btn = (dynamic)sender;

     string text = btn.Text;
  }

答案 2 :(得分:0)

这是一个DataBindingComplete变体,用于清除DataGridView控件的默认选择。我有多个DataGridView控件跨多个选项卡,只需要这一个事件处理程序,这是非常棒的。这是基于VladL的回应所以所有的功劳都归功于他们。

    private void Dynamic_DataBindingComplete(Object sender, DataGridViewBindingCompleteEventArgs e)
    {
        var control = (dynamic) sender;
        control.ClearSelection();
    }