PDA

View Full Version : مشکل با رویداد OnTreeNodeCheckChanged در TreeView



davoodipoor
چهارشنبه 14 دی 1390, 10:09 صبح
با سلام به همه دوستان.
من توی یک برنامه WebApp یک صفحه دارم که در آن یک کنترل TreeView دارم. می خوام زمانیکه کاربر تیک نود پدر رو برداشت تیک تمام نودهای فرزندان برداشته شود و نیز زمانیکه تیک نود فرزند زده شد، تیک نود پدر هم زده شود. من کد مربوط به این کار را نوشته ام. ولی رویداد OnTreeNodeCheckChanged اصلاً سمت سرور نمی رفت تا کد مرا اجرا کند. به همین دلیل از تابع جاوااسکریپتی زیر استفاده کردم.
function postBackByObject()
{
var o = window.event.srcElement;
if (o.tagName == "INPUT" && o.type == "checkbox")
__doPostBack("", "");
}
مشکی که الان دارم اینه که با هر بار تیک زدن هر نود صفحه Refresh میشه و این خیلی بده. می خوام هم کدی که سمت سرور نوشتم اجرا بشه و هم اینکه صفحه Refresh نشه.
لطفاً منو راهنمایی کنین.

davoodipoor
چهارشنبه 14 دی 1390, 18:35 عصر
نیازی نبود با جاوا اسکریپت اینکار بکنید. اگه autopostback رو واسه تری ویو تون true میکردی میرفت سمت سرور ./واسه رفرش نشدن هم از آپدیت پنل ای جکس استفاده کنید

با تشکر از پاسختون.
اما تری ویو که autopostback نداره و مشکل دیگه هم اینکه از UpdatePanel استفاده کردم ولی بازم صفحم رفرش میشه.

hamid_shrk
چهارشنبه 14 دی 1390, 18:43 عصر
بله حق با شماست اصلا حواسم نبود به این نکته.
تو فانکشن جاوا اسکریپتت یک doPostBack دارید که باعث رفرش شدن صفحه میشه ، اگه اونو بردارید چی میشه؟

davoodipoor
پنج شنبه 15 دی 1390, 09:38 صبح
دیگه نه صفحه رفرش میشه و نه متد OnTreeNodeCheckChanged که در سمت سرور نوشتم اجرا میشه. در واقع برای اجرای متد OnTreeNodeCheckChanged باید صفحه سمت سرور بره و این یعنی رفرش شدن، که شما تصور کنید با هر بار تیک زدن یکی از چک باکس ها صفحه رفرش بشه چقدر اعصاب خوردیه؟؟؟
حالا با توجه به اینکه UpdatePanel نتونست کار کنه میخواستم ببینم راه دیگه ای هست؟
البته خودم فکر میکنم که باید به جای متد OnTreeNodeCheckChanged از یک تابع جاوااسکریپتی استفاده کنم ولی از اونجایی که من جاوا اسکریپت خیلی بلد نیستم می خواستم ببینم شما می تونید به من کمک کنید.
ضمناً کدی که من در رویداد OntreeNodeCheckChanged نوشتم اینه:
if (!e.Node.Checked)
for (int i = 0; i < e.Node.ChildNodes.Count; i++)
e.Node.ChildNodes[i].Checked = false;
if (e != null && e.Node != null)
if (e.Node.Checked == true && e.Node.Parent != null)
e.Node.Parent.Checked = true;

hamid_shrk
پنج شنبه 15 دی 1390, 10:01 صبح
با یه سرچ تو گوگل این موارد رو براتون پیدا کردم :
http://www.eggheadcafe.com/community/javascript/3/10039160/checkuncheck-tree-view-check-boxes-using-javascript.aspx
http://forums.asp.net/t/976122.aspx
http://geekswithblogs.net/ranganh/archive/2006/03/25/73300.aspx
http://geekswithblogs.net/ranganh/archive/2009/01/21/updated-asp.net-treeview-checkboxes-ndash-check-all-ndash-javascript.aspx

davoodipoor
پنج شنبه 15 دی 1390, 11:04 صبح
ممنون از توجه و سرچتون.
این موارد کمک خوبی بهم کرد فقط یک چیز دیگه ای که من می خوام ولی این نمونه ها اونو پوشش ندادن اینه که من می خوام با کلیک روی یک نود فرزند تیک نود پدر هم خورده شود.
اگه در این زمینه هم منو راهنمایی کنین ممنون میشم.

hamid_shrk
پنج شنبه 15 دی 1390, 11:25 صبح
فکر میکنم اگه بتونی از لینک ها استفاده کنی و کدت رو بنویسی قسمت دوم رو هم به راحتی بتونی پیاده سازی.
با این حال من سرم خلوت بشه سعی میکنم واست سرچ کنم

davoodipoor
پنج شنبه 15 دی 1390, 14:35 عصر
من کدهارو خوندم ولی چون جاوااسکریپت بلد نیستم، شاید نوشتن این کد زمان زیادی ببره. اگه شما بتونید به من کمک کنید واقعاً ممنون میشم. من از لینک سومی که داده بودید استفاده کردم.

rezaei manesh
یک شنبه 02 بهمن 1390, 17:48 عصر
ممنون از توجه و سرچتون.
این موارد کمک خوبی بهم کرد فقط یک چیز دیگه ای که من می خوام ولی این نمونه ها اونو پوشش ندادن اینه که من می خوام با کلیک روی یک نود فرزند تیک نود پدر هم خورده شود.
اگه در این زمینه هم منو راهنمایی کنین ممنون میشم.

سلام
من هم همین مشکل رو دارم یعنی می خوام با تیک زدن فرزند پدر هم خودکار تیک بخوره

davoodipoor
چهارشنبه 05 بهمن 1390, 13:29 عصر
سلام
با نوشتن این سه متد من تونستم مشکلم رو حل کنم. امیدوارم مشکل شما هم حل بشه.

function GetParentByTagName(parentTagName, childElementObj) {
var parent = childElementObj.parentNode;
while (parent.tagName.toLowerCase() != parentTagName.toLowerCase()) {
parent = parent.parentNode;
}
return parent;
}
function CheckParent(ChildNode) {
var parentTable = GetParentByTagName("TABLE", ChildNode);
parentTable = parentTable.parentNode.previousSibling;
var inpElemsInParentTable = parentTable.getElementsByTagName("input");
if (inpElemsInParentTable.length > 0) {
var parentNodeChkBox = inpElemsInParentTable[0];
parentNodeChkBox.checked = true;
}
}
function client_OnTreeNodeChecked() {
var obj = window.event.srcElement;

var treeNodeFound = false;
var checkedState;
if (obj.tagName == "INPUT" && obj.type == "checkbox") {
var treeNode = obj;
checkedState = treeNode.checked;
if (checkedState == true)//satari
CheckParent(obj);//satari
do {
obj = obj.parentElement;
} while (obj.tagName != "TABLE")

var parentTreeLevel = obj.rows[0].cells.length;
var parentTreeNode = obj.rows[0].cells[0];
var tables = obj.parentElement.getElementsByTagName("TABLE");
var numTables = tables.length
if (numTables >= 1) {
for (i = 0; i < numTables; i++) {
if (tables[i] == obj) {
treeNodeFound = true;
i++;
if (i == numTables) {
return;
}
}
if (treeNodeFound == true) {
var childTreeLevel = tables[i].rows[0].cells.length;
if (childTreeLevel > parentTreeLevel) {
var cell = tables[i].rows[0].cells[childTreeLevel - 1];
var inputs = cell.getElementsByTagName("INPUT");
inputs[0].checked = checkedState;
}
else {
return;
}
}
}
}
}
}