【问题标题】:ASP.NET PostBack on selecting checkbox of treeviewASP.NET PostBack 选择树视图的复选框
【发布时间】:2013-04-11 09:18:59
【问题描述】:

我有一个 asp.net 项目并使用 C# 工作。

在我的项目中,我有一个带有复选框的数据绑定列表框。

当用户点击一个复选框时,它应该更新一个标签/文本框。

问题是,在我单击执行回发的按钮之前,它不会更新标签/文本框。我将如何调用复选框更改事件的回发,因为“OnTreeNodeCheckChanged”事件看起来只有在触发回发后才会触发? 这甚至是一个好主意吗(每次更改复选框时都想调用回发)

--更新代码片段-- ASP

 <asp:TreeView ID="treevCourses" runat="server" AutoPostBack="true" ShowCheckBoxes="All" Width="100%"
                OnTreeNodeCheckChanged="check_changed" Height="16px" ImageSet="Contacts">

(尝试在 C# 部分中使用处理程序。) C#

protected void check_changed(object sender, TreeNodeEventArgs e)
        {
        lblTest.Text = "TestText";
        }

(也尝试将它放在脚本部分)

void check_changed(object sender, EventArgs e)
    {
        lblTest.Text = "TestText";
    }

将数据绑定到 Treeview(这发生在按钮回发上)

foreach (DataRow row in ds.Tables[0].Rows)
                {
                    TreeNode node = new TreeNode(row["courseName"].ToString(), row["courseName"].ToString());
                    //  node.PopulateOnDemand = true;
                    treevCourses.Nodes.Add(node);
                }


                //select from topic where parentId = topicId.
                ds = myConClass.returnSqlDataset("select cd.courseName,ct.[date] from courseDetails cd join courseTimes ct on cd.courseId = ct.courseId");

                foreach (TreeNode treenode in treevCourses.Nodes)
                {
                    foreach (DataRow row in ds.Tables[0].Rows)
                    {
                        if (row["courseName"].ToString() == treenode.Value)
                        {
                            TreeNode node = new TreeNode(row["date"].ToString(), row["date"].ToString());
                            treenode.ChildNodes.Add(node);
                        }
                    }       
                }

【问题讨论】:

  • 给我简要说明......
  • 我不明白你的意思
  • 你能用相关代码更新问题吗?
  • 在哪里将数据绑定到 TreeView?
  • 我已经添加了您首先标记为正确的答案。达米特基本上只是复制了我发布的内容

标签: c# asp.net treeview postback


【解决方案1】:

TreeView 上没有AutoPostBack 属性。根据MSDNTreeNodeCheckChanged 事件在TreeView 控件中的复选框更改发送到服务器之间的状态时引发

你需要做点别的事情,就像this link 中提到的那样

1) 在页面加载时向 TreeView1 添加点击属性

protected void Page_Load(object sender, EventArgs e)
{
     TreeView1.Attributes.Add("onclick", "postBackByObject()");
}

2) 添加java脚本函数并回发

    <script type="text/javascript">

     function postBackByObject()
     {
         var o = window.event.srcElement;
         if (o.tagName == "INPUT" && o.type == "checkbox")
        {
           __doPostBack("","");
        } 
    }
   </script>

3)。实现TreeNodeCheckChanged事件

protected void TreeView1_TreeNodeCheckChanged(object sender, TreeNodeEventArgs e)
        {
            // do stuff
        } 

【讨论】:

  • O.o 成功了...谢谢。奇怪的是,在 JavaScript 中我似乎找不到 window.event(只有 window.eval 和 window.escape)仍然是一个主要的初学者,所以可能会在某个地方找到它,所以感谢帮助人,这非常有效。跨度>
  • 使用 java 脚本回发会影响更新面板。假设我想要部分回发,更新面板不起作用。
  • 3)。实现 TreeNodeCheckChanged 事件 - 在 asp:TreeView 上添加 OnTreeNodeCheckChanged(以防其他像我这样的新手正在苦苦挣扎)
【解决方案2】:

当你动态绑定 TreeView 时,TreeNodeCheckChanged 事件不会在你点击复选框时被触发,你可以很容易地克服这个问题,尽管使用一点 javascript:

ASPX:

<head runat="server">
    <script type="text/javascript">
        function fireCheckChanged() {
            var o = window.event.srcElement;
            if (o.tagName == "INPUT" && o.type == "checkbox") {
                __doPostBack("", "");
            }
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:TreeView ID="treevCourses" runat="server" 
            ShowCheckBoxes="Parent,Leaf" Width="100%" Height="16px" ImageSet="Contacts" 
            ontreenodecheckchanged="check_changed" />
    </div>
    </form>
</body> 

背后的代码:

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        var data = new XmlDataSource();
        data.DataFile = Server.MapPath("~/input.xml");
        treevCourses.DataSource = data;
        treevCourses.DataBind();

        treevCourses.Attributes.Add("onclick", "fireCheckChanged()");
    }
}

protected void check_changed(object sender, TreeNodeEventArgs e)
{
    string clickedNode = e.Node.Text;
    System.Diagnostics.Debugger.Break();
}

这是个好主意吗 - 显然,每次更改复选框状态时向服务器发送请求会占用大量资源,但如果您无法使用 javascript 复制相同的功能,那么这是您唯一的选择 p>

【讨论】:

  • 它不起作用...当您单击其中一个节点时,它会回发,但当您单击复选框时则不会
【解决方案3】:

替换此行

treevCourses.Attributes.Add("onclick", "fireCheckChanged()");

treevCourses.Attributes.Add("onclick", "fireCheckChanged(event)");

并将脚本替换为

  function fireCheckChanged(e) {
 var evnt = ((window.event) ? (event) : (e));
 var element = evnt.srcElement || evnt.target;

 if (element.tagName == "INPUT" && element.type == "checkbox") {
      __doPostBack("", "");
}}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-11
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多