[英]ASP.NET PostBack on selecting checkbox of treeview
我有一個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上沒有AutoPostBack
屬性。 並且根據MSDN ,當TreeView
控件中的復選框在發布到服務器的帖子之間改變狀態時,會引發TreeNodeCheckChanged
事件
您需要做其他事情, 如此鏈接中提到的那樣
1)在頁面加載時將Click屬性添加到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
}
當你動態綁定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("", "");
}}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.