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

C# 在asp.net webforms中以编程方式分配事件的正确方法,c#,asp.net,events,user-controls,C#,Asp.net,Events,User Controls,我需要一个具有复选框的树视图,在展开节点时异步获取数据以填充节点,并在单击复选框时自动适当地选中/取消选中子/父节点 唯一不起作用的部分是在单击子节点/父节点时选中/取消选中子节点/父节点。虽然点击复选框时有一个事件可用,但它不会自动发回,所以我添加了一些javascript使其这样做 当我直接从控件获取数据时,它工作得非常好,但是当我决定重构控件以便在其他地方使用它时,我决定创建一个事件,使用代码将分配给该事件,以便为控件提供从正确位置获取数据的方法 我在控件所在页面的Page_Load上分配

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

唯一不起作用的部分是在单击子节点/父节点时选中/取消选中子节点/父节点。虽然点击复选框时有一个事件可用,但它不会自动发回,所以我添加了一些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()" />

函数postBackByObject(){
var o=window.event.src元素;
如果(o.tagName==“输入”&&o.type==“复选框”){
__doPostBack(“,”);
}
}

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

事实上,我没有看到问题,代码应该可以正常工作。但是,我建议您更改javascript代码,因为它在Firefox()中不起作用

函数postBackByObject(e){
var evt=e | | window.event;
var o=evt.target;
如果(o.tagName==“输入”&&o.type==“复选框”){
__doPostBack(“,”);
}
}

很高兴知道。我想我不是很清楚,因为问题不在于发布的代码。。。只是为了让读者知道我是如何写这篇文章的,以防它与如何调用页面加载有关。
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);" />