【问题标题】:ASP.Net User Control Event Bubbling (C#)ASP.Net 用户控制事件冒泡 (C#)
【发布时间】:2010-02-02 18:35:51
【问题描述】:

提前非常感谢。我已经尽职尽责并研究了 2 天,但似乎无法完全理解在线教程所描述的内容。

情况:首席程序员起起落落。公司老板知道我已经做了一些(新手)VB.NET,并要求我在他的 Intranet 应用程序(用 C# 编写)上连接两个自定义用户控件之间的功能。回答专业人士的小问题 - 我很流利在 Visual Studio 中...但仍在学习 C#)。

这是对控件的简化描述,但希望足以让我们朝着正确的方向前进:

UserControl_1 包含多个链接按钮,单击这些按钮时,应更改 UserControl_2 中 ObjectDataSource 使用的 SelectParameter 的值:

<asp:LinkButton ID="OpenBtn1" runat="server" Text="Show Open Requests" />
<asp:LinkButton ID="ClosedBtn1" runat="server" Text="Show Closed Requests" />

UserControl_2(带有 DataSource 的 GridView):

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
    SelectMethod="GetDataBy_Status" 
    TypeName="adhoc_TblAdptrs.adhoc_TblAdptr">
    <SelectParameters>
       <asp:Parameter DefaultValue="All" Name="status" Type="String" />
    </SelectParameters>
</asp:ObjectDataSource>

<asp:GridView1 ID="GridView1" runat="server" DataSourceID="ObjectDataSource1" />

我想要将一个新的默认值传递给 UserControl_2 中 ObjectDataSource 的 SelectParameter。我期待专业人士的个性化解释!非常感谢您的帮助!

【问题讨论】:

  • 不要敲木工。这是一项有用的技能,你可以从中赚钱。

标签: asp.net user-controls event-bubbling


【解决方案1】:

我会在 UserControl2 中公开一个属性,然后设置参数值

public string ParamValue { get; set; }

protected void ObjectDataSource1_Selecting(object sender, ObjectDataSourceSelectingEventArgs e) {
    if (ParamValue.Length > 0){
        e.InputParameters["status"] = ParamValue;
    }
}

另外,在页面中创建将在控件中设置属性的公共方法

public void SetParamValue(string Value){
    UserControl_2.ParamValue = Value;
}

从这里,在链接按钮点击事件中,您可以使用页面的方法设置公共属性:

  void OpenBtn1_Click(Object sender, EventArgs e){
     ((YourPageClassHere)this.Page).SetParamValue("Open");
  }

此方法将完成工作,但会将控件与链接按钮耦合到此特定页面。

如果你想去除耦合,那么你可以用方法实现一个接口

public interface IParameterValuePage{
    public void SetParamValue(string Value)
}

然后在您的页面中实现它并检查控制页面的代码

  void OpenBtn1_Click(Object sender, EventArgs e){
      if (this.Page is IParameterValuePage){
          ((IParameterValuePage)this.Page).SetParamValue("Open");
      }
      else{
          throw new Exception("Page must implement IParameterValuePage");
      }
  }

【讨论】:

  • +1。我同意这个答案。加上另一个考虑因素.. 我想知道两个用户控件是否可以合并为一个?它们似乎已经紧密耦合了......
  • 我一直在想同样的事情,直到我发现在他网站的不同地方使用了相同的控件,在这些地方绑定链接按钮是没有意义的。
  • Russ -- 我理解你迄今为止的建议,但是......我不需要一种方法来将 UserControl_1 中的链接按钮的点击事件“冒泡”到页面上,以便页面上的功能可以改变参数吗? (我问这是因为如果在 UserControl_2 中的 gridview/ObjectDataSource 不存在的页面中使用 UserControl_1,那不会引发错误吗?)
  • @Daniel,请查看我的编辑,因为我已经更改了一些内容并添加了一个不需要耦合的更好的解决方案。
  • 太棒了。谢谢,拉斯。你给了我非常明确的指示。非常非常感谢!
猜你喜欢
  • 2013-09-20
  • 2012-07-01
  • 1970-01-01
  • 2013-01-23
  • 1970-01-01
  • 2011-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多