如何将回发的Sender标识为UserControl以获取对应控件值
从DropDownList回发事件中获取所属UserControl的方法
嘿,这个问题我之前也碰到过——当用户控件里的DropDownList触发回发时,事件的Sender确实是具体的DropDownList控件,而不是UserControl本身。不过别担心,有几种简单的方式可以让你轻松找到它所属的UserControl,进而获取控件里的各种值:
方法1:通过NamingContainer向上查找父级UserControl
ASP.NET控件的NamingContainer属性会指向它所在的命名容器,对于用户控件内的控件来说,我们可以通过遍历这个属性找到上层的UserControl实例。
你可以写一个通用的父控件查找方法,然后在事件处理里调用:
protected void DropDownList_SelectedIndexChanged(object sender, EventArgs e) { // 先把Sender转成DropDownList DropDownList triggerDdl = sender as DropDownList; if (triggerDdl == null) return; // 查找所属的UserControl(把YourUserControl替换成你的用户控件类名) YourUserControl targetUc = FindParentControl<YourUserControl>(triggerDdl); if (targetUc != null) { // 现在可以自由访问UserControl里的任意控件值了 string value1 = targetUc.DropDownList1.SelectedValue; string value2 = targetUc.DropDownList2.SelectedValue; // 当然也能直接拿当前触发事件的DropDownList的值:triggerDdl.SelectedValue } } // 通用的父控件查找工具方法 private T FindParentControl<T>(Control control) where T : Control { while (control != null && !(control is T)) { control = control.NamingContainer; } return control as T; }
这个方法的好处是通用性强,不管你的控件嵌套多少层,都能找到目标容器。
方法2:绑定事件时直接传递UserControl实例
如果你是在UserControl内部给DropDownList绑定事件,可以通过匿名委托把当前UserControl实例直接传递到事件处理方法里,这样就不用再向上查找了:
protected void Page_Load(object sender, EventArgs e) { // 给每个DropDownList绑定事件时,带上当前UserControl实例 DropDownList1.SelectedIndexChanged += (s, args) => Ddl_SelectedIndexChanged(s, args, this); DropDownList2.SelectedIndexChanged += (s, args) => Ddl_SelectedIndexChanged(s, args, this); DropDownList3.SelectedIndexChanged += (s, args) => Ddl_SelectedIndexChanged(s, args, this); } private void Ddl_SelectedIndexChanged(object sender, EventArgs e, YourUserControl currentUc) { // 这里直接拿到了UserControl实例 DropDownList triggerDdl = sender as DropDownList; if (triggerDdl != null) { string currentValue = triggerDdl.SelectedValue; string otherValue = currentUc.DropDownList1.SelectedValue; // 执行你的业务逻辑 } }
这种方式更直接,省去了遍历容器的步骤,代码可读性也更高。
额外小提示:如果只需要当前DropDownList的值
如果你只是想获取触发事件的那个DropDownList的选中值,其实根本不用找UserControl,直接把Sender转成DropDownList就能拿到:
protected void DropDownList_SelectedIndexChanged(object sender, EventArgs e) { DropDownList ddl = sender as DropDownList; if (ddl != null) { string selectedValue = ddl.SelectedValue; // 直接使用这个值即可 } }
内容的提问来源于stack exchange,提问作者ChandaMAMA
相关产品推荐
相关产品推荐

