ASP.. NET关于选择树视图复选框的回发
本文关键字:视图 复选框 选择 NET 于选择 ASP | 更新日期: 2023-09-27 18:08:31
我有一个asp.net项目,在c#中工作。
在我的项目我有一个有复选框的绑定列表框。
当用户点击一个复选框时,它应该更新一个标签/文本框。
问题是,它不更新标签/文本框,直到我点击一个按钮,做回发。我将如何调用复选框更改事件的回发,因为"OnTreeNodeCheckChanged"事件看起来像它只触发一次回发?这是一个好主意吗(每次更改a复选框时都要调用回发)
——更新的代码片段——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上没有AutoPostBack
属性。根据MSDN,当TreeView
控件中的复选框在发送到服务器的帖子之间改变状态时,会引发TreeNodeCheckChanged
事件
你需要做一些其他的事情,就像这个链接上提到的
1)在页面加载时为TreeView1添加click属性
protected void Page_Load(object sender, EventArgs e)
{
TreeView1.Attributes.Add("onclick", "postBackByObject()");
}
2)添加Java脚本函数并做post back
<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
}
当你动态绑定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复制相同的功能,那么这是你唯一的选择
替换这一行
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("", "");
}}