ASP.Net用户控件事件冒泡(C#)

3
非常感谢你的信任。我已经做好了功课并进行了两天的研究,但似乎无法理解在线教程所描述的内容。
情况是这样的:首席程序员辞职了。公司老板知道我在业余时间做了一些VB.NET,并要求我在他的内部应用程序(用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(具有数据源的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。希望专业人士能够进行个性化的解释!非常感谢您的帮助!


3
别看不起木工手艺。它是一项有用的技能,你可以通过它赚钱。 - David Thornley
1个回答

3
我会在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。我同意这个答案。再考虑一个方面... 我想知道是否可以将这两个用户控件合并成一个?它们似乎已经紧密耦合了... - KP.
我也曾这样想,直到我发现同一个控件在他的网站上的不同位置使用,而在那些位置上将链接按钮绑定起来就没有意义了。 - Daniel
Russ,我理解你目前提出的建议,但是...我需要一种方法来将UserControl_1中LinkButton的点击事件“冒泡”到页面上,以便页面上的函数可以更改参数吗?(我之所以这样问是因为如果在使用UserControl_1的页面中,UserControl_2中的GridView/ObjectDataSource不存在,那么会不会引发错误?) - Daniel
@Daniel,请查看我的编辑,因为我改变了一些东西并添加了一个更好的解决方案,不需要耦合。 - Russ Bradberry
太棒了。谢谢,Russ。你给了我非常清晰的指示。非常感激! - Daniel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接