以编程方式分配给asp.net webforms中的事件的正确方法

时间:2014-05-23 22:53:20

标签: c# asp.net events user-controls

我需要一个具有复选框的树视图,在扩展时异步获取数据以填充节点,并在单击复选框时自动检查/取消选中子/父节点。

开箱即用的唯一部分是在点击子/父节点时检查/取消选中子/父节点。虽然有一个事件可用于单击复选框时,它不会自动回发,所以我添加了一些javascript来实现它。

当我直接从控件获取数据时,它工作得非常好,但是当我决定重构控件以便我可以在其他地方使用它时,我决定创建一个消耗代码将分配给它的事件以便提供控件是从正确的位置获取数据的一种方式。

我在控件所在的页面的Page_Load上分配给我的事件,这适用于扩展节点,因为事件在每个回发的开头再次分配。但是,当我单击一个复选框时,控件所在的页面的Page_Load事件不会被调用,因此事件不会被分配给。

我已经计划实现一个替代解决方案,它将使用jQuery在客户端进行检查/取消检查而不回发,但我真的想知道处理这种情况的正确设计模式。

下面是aspx,它显示了我如何回发。如果需要或者我的解释不清楚,我可以发布其他代码。

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="DepartmentTreeView.ascx.cs" Inherits="TrainUp.Web.Lms.Mtv.Controls.RequiredTraining.DepartmentTreeView" %>


    <script type="text/javascript">
        <%-- This is used to cause a postback when a checkbox is clicked, 
             which allows the DepartmentTree_TreeNodeCheckChanged event to get raised --%>
        function postBackByObject() {
            var o = window.event.srcElement;
            if (o.tagName == "INPUT" && o.type == "checkbox") {
                __doPostBack("", "");
            }
        }

    </script>

    <asp:TreeView ID="DepartmentTree" SkinId="Contacts" runat="server" 
            OnTreeNodePopulate ="DepartmentTree_TreeNodePopulate" 
            OnTreeNodeCheckChanged="DepartmentTree_TreeNodeCheckChanged"
            OnClick="javascript:postBackByObject()" />

2 个答案:

答案 0 :(得分:0)

无法添加评论但听起来并不是因为您没有将代码置于页面生命周期的正确状态以再次呈现树视图。您可以使用webcontrol重用树视图,或者将所有逻辑封装在js文件中,并在需要使用它的每个页面上引用它。

答案 1 :(得分:0)

实际上我没有看到问题,代码应该可以正常工作。但是,我建议更改您的javascript代码,因为它不适用于Firefox(window.event.srcElement doesn't work for firefox?

function postBackByObject(e) {
    var evt = e || window.event;
    var o = evt.target;
    if (o.tagName == "INPUT" && o.type == "checkbox") {
        __doPostBack("", "");
    }
}

<asp:TreeView ID="DepartmentTree" runat="server" ShowCheckBoxes="All"
     ShowExpandCollapse="true"
     OnTreeNodePopulate="DepartmentTree_TreeNodePopulate"
     OnTreeNodeCheckChanged="DepartmentTree_TreeNodeCheckChanged"
     OnClick="postBackByObject(event);" />