C#在方法和事件处理程序之间传递变量

时间:2011-03-22 12:50:04

标签: c#

我仍在尝试了解c#,我的问题是我如何将一个变量从Item1_Click传递给Item2_Click,这与在方法之间传递它们是一回事还是因为它们是事件处理程序而不同?

public partial class Events : System.Web.UI.UserControl
{
     protected void Item1_Click(object sender, EventArgs e)
    {

          //code

    }

    protected void Item2_Click(object sender, EventArgs e)
    {
          //code
    }
}

7 个答案:

答案 0 :(得分:2)

它们仍然是常规方法,因此您仍然可以像平常一样调用它们。

 protected void Item1_Click(object sender, EventArgs e)
 {
    // Call the event handler for Item2, passing the arguments
    // Item1 received
    Item2_Click(sender, e);
 }

 protected void Item2_Click(object sender, EventArgs e)
 {
     // Make it happen.
 }

如果您想重新使用Item1_Click,只需将另一个对象的click事件绑定到Item1_Click

有关C#中事件的更多信息,请参阅以下链接。

答案 1 :(得分:1)

事件处理程序由事件的发布者调用。因此,如果两个处理程序属于同一类型,则需要将值缓存在成员变量中。 Item1单击缓存某些内容(例如变量中的选择)和Item2单击使用此成员变量进行自己的处理。

然而,没有什么可以阻止你从事件处理程序#1调用事件处理程序#2;因为它毕竟是一种方法。在这种情况下,可以插入EventHandler参数中的参数,但它有点不直观。

答案 2 :(得分:0)

您在上面展示的是一种方法。只是我想象你已经在几个按钮上订阅了你的方法。

然后由按钮填充EventArgs实例本身。如果您希望更改EventArgs中的内容,则需要从Button继承并覆盖OnClick方法以手动触发事件。

您可以在表单上包含一些状态信息(如果您希望在两种方法之间共享信息)。或者,如果你真的想要将信息从Item1_Click传递到Item2_click,那么你可以打电话:

protected void Item1_Click(object sender, EventArgs e)
{
    this.Item2_Click(sender new EventArgs()); // <== Stick information in EventArgs
}

答案 3 :(得分:0)

如果要保留第一次点击的某些值,可以设置变量并从其他处理程序中读取。

 public partial class Events : System.Web.UI.UserControl
 {
      private SomeType variable;

      protected void Item1_Click(object sender, EventArgs e)
     {
           variable = someValue;
           //code
     }

     protected void Item2_Click(object sender, EventArgs e)
     {
           //code + do stuff with variable
     }
 }

答案 4 :(得分:0)

事件处理程序本身就是方法,所以没有区别。在方法之间发送数据(如果你愿意,可以通过参数),但是,事件处理程序需要具有特定的签名,因此您不能只添加更多参数。这里的方法是使用类成员(字段或属性)作为@ Zebi的答案中提到的某种“全局变量”(类的全局变量)

希望这会有所帮助:)

答案 5 :(得分:0)

您可能希望创建包含Item1_Click和Item2_Click功能的方法,而不是直接调用事件处理程序。例如..

public partial class Events : System.Web.UI.UserControl
{
     protected void Item1_Click(object sender, EventArgs e)
    {

          var theParam = GetParamValue();
          //code
          Item1Method(theParam);

    }

    protected void Item2_Click(object sender, EventArgs e)
    {               
           Item2Method();
    }

     private void Item1Method(object param1)
     {
        // Item 1 code goes here...
     }
     private void Item2Method()
     {
          //item 2 code goes here...
          // then call Item1Method
          var param2 = GetParamValue();
          Item1Method(param2);
     }
}

这只是一个如何避免调用事件处理程序的示例。这样做可以使您的代码在未来更加可维护。

此外,现在您不必担心在尝试运行Item1_Click中的功能时提供发件人和事件参数作为参数

答案 6 :(得分:0)

事件处理程序只是一种方法,在某些特定方案中调用。没有什么可以阻止你明确地调用这些方法,所以

protected void Item1_Click(object sender, EventArgs e)     
{            
  Item2_Click(sender, e); //pass the original arguments
  Item2_Click(null, null); //pass some other arguments
  Item1_Click(null, null); //recursively call the handler.
} 

是完全有效的C#代码。但是,除了基本上处理事件之外,将事件处理程序用于其他任何事情都是不好的做法。如果两个处理程序需要使用相同的逻辑,那么最好这样做:

protected void Item1_Click(object sender, EventArgs e)
{
  CommonLogic();
}

protected void Item2_Click(object sender, EventArgs e)
{
  CommonLogic();
}

private void CommonLogic()
{
  //the common logic goes here
}