PDA

View Full Version : مشکل ذخیره و لود اطلاعات Tree View با Entity Framwork



va2012
چهارشنبه 26 مهر 1391, 18:19 عصر
سلام دوستان.

من توی برنامم از یک treeview استفاده میکنم که تعداد نود های اصلی و یا فرزند اون بسته به خواسته کاربر نامحدود هست و میخوام ثبت و ویرایش و حذف نود ها هم داخل خود treeView صورت بگیره. حالا میخوام این نودها رو در دیتابیس SQL Server به ترتیب ذخیره و لود کنم. برای این کار سه تا فیلد NodeId - ParentId - NodeText در دیتابیس تعریف کردم و مشخصات هر نود رو در این فیلد ها ذخیره میکنم و هنگام لود با استفاده از یک تابع بازگشتی که با جستجو از همین سایت پیدا کردم نود ها رو نمایش میدم. . ولی مشکلی که وجود داره اینه که موقع ذخیره و لود اطلاعات - به اون شکل که باید عمل کنه نمیکنه. از XML هم نمیخوام استفاده کنم.

نمونه فایل رو هم ضمیمه کردم. اگر هم کسی نمونه برنامه ای در این مورد داره ممنون میشم اینجا قرار بده.

Catagory اسم جدول دیتابیس هست و tv1 نام کنترل tree View . برای نود هایی که Parent نداشته باشن هم ایندکس 1- رو ذخیره میکنم.

این نمونه کدهای برنامه :

private void Form1_Load_1(object sender, EventArgs e)
{
using (var contex = new DataBaseEntities())
{
tv1.Nodes.Clear();

var Node1 = contex.Catagories;

foreach (var m in Node1)
{
if (m.ParentID == -1)
{
TreeNode root = new TreeNode();

root.Text = m.NodeText;
tv1.Nodes.Add(root);

CreateNodesOfParent(m.NodeID, root);
}

}

}
}

public void CreateNodesOfParent(int ParentID, TreeNode root)
{
using (var contex = new DataBaseEntities())
{
Catagory x = new Catagory();

foreach (var i in contex.Catagories.Where(C => C.ParentID == ParentID))
{
TreeNode node = root.Nodes.Add(i.NodeText);
CreateNodesOfParent(i.NodeID, node);
}
}
}

private void toolStripButton4_Click(object sender, EventArgs e)
{
if (tv1.SelectedNode == null)
{
node = new TreeNode("گروه جدید");
node.ImageIndex = 16;
tv1.Nodes.Add(node);
node.BeginEdit();
}
else
{
node = new TreeNode("گروه جدید");
node.ImageIndex = 16;
tv1.SelectedNode.Nodes.Add(node);
node.BeginEdit();
}


}

private void tv1_AfterLabelEdit(object sender, NodeLabelEditEventArgs e)
{
using (var contex = new SourceCodeDataBaseEntities())
{
Catagory x = new Catagory();

x.NodeText = node.Text;
x.NodeID = node.Index;
x.ParentID = node.Parent.Index;
contex.AddToCatagories(x);
contex.SaveChanges();
}
}

hakim22
چهارشنبه 26 مهر 1391, 21:36 عصر
من همه ی این کار رو میتونم با 6 خط کد XML انجام بدم و فقط یک فایل (یا نهایتا یک فیلد از یک رکورد) لازمه
3 خط دخیره - 3 خط بازیابی !

اولا که بزرگی گفته بزرگی گفته خطا یابی یک کد نبوغ بیشتری از نوشتن اون کد لازم داره .اینه که ساده بنوسید !
بیشتر توضیح بدید رفتاری که برنامه داره چیه !؟

va2012
چهارشنبه 26 مهر 1391, 22:26 عصر
من همه ی این کار رو میتونم با 6 خط کد XML انجام بدم و فقط یک فایل (یا نهایتا یک فیلد از یک رکورد) لازمه
3 خط دخیره - 3 خط بازیابی !

اولا که بزرگی گفته بزرگی گفته خطا یابی یک کد نبوغ بیشتری از نوشتن اون کد لازم داره .اینه که ساده بنوسید !
بیشتر توضیح بدید رفتاری که برنامه داره چیه !؟


خوب من که بالا گفتم بلدم با XML این کار رو انجام بدم :متعجب: ولی میخوام داخل دیتابیس ذخیره کنم. منظورت رو متوجه نمیشم دیگه چه جور از این ساده تر بگم.شما نمونه فایل رو که ضمیمه کردم ببینی و یکی دوتا نود به برنامه اضافه کنی متوجه میشی که موقع ذخیره نود ها چند فرزند رو با ایندکس صفر ذخیره میکنه و به این خاطر موقع لود هم نودها اشتباهی لود میشن.:ناراحت:

مثلا وقتی نود اصلی (پدر) ایندکس 1 داره و یک نود فرزند بهش اضافه میکنم ایندکس نود فرزند اول 0 میشه و وقتی به این نود که ایندکس صفر داره یک نود فرزند دیگه اضافه می کنم بازهم ایندکس نود فرزند جدید 0 میشه و این روند ادامه داره. حالا مشکل موقع لود هست که همه نودهای فرزند که ایندکس 0 دارند رو زیر مجموعه یک نود پدر قرار میده و سلسله مراتب اول رو حفظ نمیکنه.الان من میخوام بفهمم که این کدها رو باید چه طور تغییر بدم که این مشکل حل بشه.

اگر برنامه رو امتحان کنی منظورم رو کامل متوجه میشی.

aliyan_mm
دوشنبه 20 آذر 1391, 10:25 صبح
سلام دوست عزیز va2012 (http://barnamenevis.org/member.php?210420-va2012) لطفا پایگاه sql هم ضمیمه کنید . فایلی که ضمیمه کرده اید به درستی کار نمی کند