PDA

View Full Version : تغییر selectednode در treeviewتوسط کد



negar84
دوشنبه 15 آبان 1385, 19:22 عصر
سلام
ایا چنین چیزی امکان دارد ؟

negar84
سه شنبه 16 آبان 1385, 10:44 صبح
سلام شاید بهتره سئوالم را یه جور دیگه مطرح کنم
من برای پر کردن درخت از روی database از این کد استفاده می کنم ولی فقط بار اول selectednode تغییر می کنه ... به نظر شما باید چی کار کنم و مشکل از کجاست ؟

void filltree(string father,TreeNode tn)
{

int i = 0;
int j = 0;

treeView1.SelectedNode = tn;

objDataAdapter.SelectCommand = new SqlCommand();
objDataAdapter.SelectCommand.Connection = objConnection;
objConnection.Open();
objDataAdapter.SelectCommand.CommandText = "SELECT distinct name,text FROM guya_tel WHERE father = " + "'" + father + "'" + "order by name";
SqlDataReader objDataReader = objDataAdapter.SelectCommand.ExecuteReader();


string[] name = new string[100]; string[] text = new string[100];
while (objDataReader.Read())
{

name[i] = objDataReader["name"].ToString();
text[i] = objDataReader["text"].ToString();
i++;
}
objDataReader.Close();
objConnection.Close();

while (name[j] != null)
{

TreeNode tn1=new TreeNode(text[j]);

treeView1.SelectedNode.Nodes.Add(text[j]);
filltree(name[j], tn1);
j++;
}



}

در ضمن در فرم لود هم این تکه کد را نوشتم

TreeNode tn = new TreeNode("پیغام ها ");

treeView1.Nodes.AddRange(new TreeNode[] { tn });
filltree("node0", tn);

خیلی ممنون میشم کمک کنید چون من خیلی باهاش کلنجار رفتم ولی نشد .....

SabaSabouhi
سه شنبه 16 آبان 1385, 11:31 صبح
سلام
بله امکان دارد، من این کار را دقیقاً به همین صورت انجام مى‌دهم.
اما از شما پرسشى دارم، هنگام پر کردن یک TreeView چه دلیلى براى Select کردن یک Node دارید؟ به راحتى Node هاى جدید را به همان tn اضافه کنید. نیازى نیست که آن را Select کنید.
و پرسش دوم این که وقتى فقط یک Node را دارید اضافه مى‌کنید چرا از AddRande استفاده مى‌کنید؟ از همان Add استفاده کنید که راحت‌تر هست.

صبا صبوحى

negar84
سه شنبه 16 آبان 1385, 12:06 عصر
سلام صبا جان ممنون از اینکه جواب دادین ..
اول یه توضیحی در مورد کماری که انجام دادم می دم:
من treeview را از روی دیتا بیس پر می کنم در ابتدای اجرای برنامه .
به این صورت که من یک جدول در نظر گرفتم که در ان parent و نام ند و text ند را در ان نگه داری می کنم .برای پر کردن treeview من یک تابعی در نظر گرفتم که نام ند پدر و ند پدر را به عنوان پارامتر می گیره بعد توی دیتا بیس تمام فرزندان ند پدر را پیدا میکنه و اونها را به treeview اضافه می کنه این کار به طور بازگشتی انجام می شه تا تمام ند ها از دیتا بیس باز یابی بشه و درخت پر بشه . ولی مشکل این جاست که

treeView1.SelectedNode = tn;
فقط بار اول selectednode را تغییر می ده و از دفعه بعد این کار رو نمی کنه که دلیلش رو من نمی دونم ...
و اما جواب سئوال هاتون :
سئوال اول: اگه select نکنم از کجا فرزندان رو تشخیص بدم ؟
سئوال دوم :از addrange به این دلیل استفاده کردم که اولین ند parent نداره و add به یه ندی(ند پدر) فرزند اضافه می کنه .

بی صبرانه منتظر پاسختون هستم
ممنون

2-

negar84
چهارشنبه 17 آبان 1385, 11:14 صبح
مشکل من حل شد کد من یک اشتباه ناشیانه داشت برای دوستانی که شاید مثل من ناشی باشند کد تصحیح شده را می گذارم.
void filltree(string father,TreeNode tn)
{

int i = 0;
int j = 0;
treeView1.SelectedNode = tn;

objDataAdapter.SelectCommand = new SqlCommand();
objDataAdapter.SelectCommand.Connection = objConnection;
objConnection.Open();
objDataAdapter.SelectCommand.CommandText = "SELECT distinct name,text FROM guya_tel WHERE father = " + "'" + father + "'" + "order by name";
SqlDataReader objDataReader = objDataAdapter.SelectCommand.ExecuteReader();


string[] name = new string[100]; string[] text = new string[100];
while (objDataReader.Read())
{

name[i] = objDataReader["name"].ToString();
text[i] = objDataReader["text"].ToString();
i++;
}
objDataReader.Close();
objConnection.Close();

while (name[j] != null)
{

TreeNode tn1 = new TreeNode(text[j]);
//treeView1.SelectedNode.Nodes.Add(text[j]);
tn.Nodes.Add(tn1);
filltree(name[j], tn1);
j++;
}


}

SabaSabouhi
چهارشنبه 17 آبان 1385, 14:34 عصر
با سلام
خوب مثل این که دیر رسیدم مشکل حل شد اما چند نکته رو بگم شاید به دردتون بخوره.
اول این که کارهایى مثل باز و بسته کردن Connection باید خارج از محیط برگشتى انجام بشه.



Recursive_Function(){
// Check Conditions and ...
}
NonRecursive_Function(){
// Open Connection and ...
// Call Recursive_Function for 1st time
}


دوم این که نیازى به Select کردن ندارید. خیلى راحت مى‌تونید این کار رو با همان متغیر tn انجام بدید. فکر کنم بهتره یک رویه AddNodeToTree ایجاد کنید که یک گره به درخت شما اضافه کنه و همانجا داشتن فرزند رو کنترل کنه اگه داشت فرزندان رو با فراخوانى تابع برگشتى به درخت اضافه کنه.
اگه توضیح بیشتر نیاز داشتید بگید تا بیشتر توضیح بدم.

صبا صبوحى

negar84
چهارشنبه 17 آبان 1385, 14:47 عصر
سلام
ممنون از راهنمایی هاتون
ولی من در مورد این که نیاز به select ندارید منظورتون رو نمی فهمم اگه select نکنم پس چه جوری بفهمم که اصلا فرزندی داره یا نه؟

SabaSabouhi
چهارشنبه 17 آبان 1385, 15:27 عصر
با سلام
Select کردن مال موقعی هست که کاربر یک گره را انتخاب می‌کنه و شما می‌خواهید نسبت به انتخاب کاربر عکس‌العمل نشون بدین.
اما در این حالت رشته کار در دست شماست. این که یک گره فرزند داره یا نه بستگی به اطلاعات درون پایگاه داده‌ی شما داره. و همیشه در برنامه شما با یک گره کار می‌کنید.
اگه بخواهم یک مثال اینجا بیاورم خیلی مفصل می‌شه پس خیلی مختصر می‌نویسم.



private void MyFunc(){
...Open Connection
...Fill DataTable
...Find Root ID
FillTree(Null, RootID);
}
private void FillTree(TreeNode pNode, int pParentID){
... Create View - Childs of (pParentID)
for (int i=0 ; i<iView.Length ; i++){
AddChild( pNode, iView["RowID"], iView["Text"]);
}
}
private void AddChild(TreeNode pNode, int pRowID, string pText){
TreeNode iNode = new TreeNode (pText);
if (pNode == null)
MyTree.Nodes.Add( iNode);
else
pNode.Nodes.Add( iNode);
FillTree( iNode, pRowID);
}



امیدوارم که مفید واقع شود.


صبا صبوحی

aminkeshani
چهارشنبه 17 آبان 1385, 16:11 عصر
با سلام
برای قرار دادن نودی که هم اکنون به درخت اضافه می شود به عنوان SelectedNode می توان به روش زیر عمل کرد

;("treeView1.SelectedNode=treeView1.Nodes.Add("Node
;("treeView1.SelectedNode=treeView1.SelectedNode.Node s.Add("Node


با تشکر از همه استادان بزرگ

HAMRAHSOFT.IR
شنبه 30 بهمن 1389, 09:21 صبح
شرمنده دوستان امكان داره يك نونه برنامه با بانك اكسس قراردبدي ياد كد