PDA

View Full Version : مشکل در نمایش ساختار درختی دیتابیس و جدول ها



hdv212
شنبه 22 اردیبهشت 1386, 23:33 عصر
سلام
من میخوام توی treeView اطلاعات دو جدول به صورت master/details نمایش بدم، اینم جداول و کد من :
t_books(bookID(PK),bookName) -> master
t_sessions(sessionID(PK),bookID(FK),sessionName) -> details

i wrote this code to show hirarical data in treeView :

SqlConnection con = new SqlConnection(Properties.Settings.Default.Database 1ConnectionString);
SqlCommand cmd = new SqlCommand();
SqlDataAdapter adapter = new SqlDataAdapter();
cmd.CommandText = "select * from t_books";
cmd.Connection = con;
adapter.SelectCommand = cmd;
DataSet ds = new DataSet();

SqlCommand cmd2 = new SqlCommand();
SqlDataAdapter adapter2 = new SqlDataAdapter();
cmd2.CommandText = "select * from t_sessions";
cmd2.Connection = con;
adapter2.SelectCommand = cmd2;

adapter.Fill(ds, "t_books");
adapter2.Fill(ds, "t_sessions");
DataRelation dataRelation;
DataColumn dc1 = ds.Tables["t_books"].Columns["bookID"];
DataColumn dc2 = ds.Tables["t_sessions"].Columns["bookID"];
dataRelation = new DataRelation("Relation1", dc1, dc2);
ds.Relations.Add(dataRelation);

TreeNode book;
TreeNode session;

foreach (DataRow row in ds.Tables["t_books"].Rows)
{
book = new TreeNode(string.Format("{0}", (string)row["bookName"]));
book.Tag = row;

ds.Tables["t_sessions"].DefaultView.RowFilter = "bookID="+ row["bookID"];
foreach (DataRow sessionRow in ds.Tables["t_sessions"].Rows)
{
session = new TreeNode(string.Format("{0}", (int)sessionRow["bookID"]));
session.Tag = sessionRow;
book.Nodes.Add(session);
}
this.treeView1.Nodes.Add(book);
}

منتها نمیدونم چرا در زمان اجرا، داده ها در هر node فیلتر نمیشن و در هر node تمام داده های جدول child که همون t_sessions باشه نمایش داده میشن، هر چی هست از فیلتر کردن داده هاست،کسی میتونه مشکل منو حل کنه ؟ مرسی

Sorenaa_s
یک شنبه 23 اردیبهشت 1386, 00:02 صبح
تاثیر RowFilter روی DataView اعمال میشه، واسه همین باید حلقه دوم روی DataView زده بشه:



ds.Tables["t_sessions"].DefaultView.RowFilter = "bookID="+ row["bookID"];
for( int i=0; i< ds.Tables["t_sessions"].DefaultView.Count; i++ )
{
DataRowView sessionRow = ds.Tables["t_sessions"].DefaultView[i];
session = new TreeNode(string.Format("{0}", (int)sessionRow["bookID"]));
session.Tag = sessionRow;
book.Nodes.Add(session);
}

hdv212
یک شنبه 23 اردیبهشت 1386, 02:59 صبح
Sorenaa_s عزیز باز هم یه زحمت دیگه، من به غیر از جدول t_sissions یه جدول دیگه ای به نام t_titles دارم که این بار این دو با هم رابطه ی master/details دارن، اینم کد من برای کل قسمتهاشه، ولی در قسمت titles باز داده ها درست در نمیان، اشکال کار از کجاست ؟

SqlConnection con = new SqlConnection(Properties.Settings.Default.Database 1ConnectionString);
SqlCommand cmd = new SqlCommand();
SqlDataAdapter adapter = new SqlDataAdapter();
cmd.CommandText = "select * from t_books";
cmd.Connection = con;
adapter.SelectCommand = cmd;
DataSet ds = new DataSet();

SqlCommand cmd2 = new SqlCommand();
SqlDataAdapter adapter2 = new SqlDataAdapter();
cmd2.CommandText = "select * from t_sessions";
cmd2.Connection = con;
adapter2.SelectCommand = cmd2;

SqlCommand cmd3 = new SqlCommand();
SqlDataAdapter adapter3 = new SqlDataAdapter();
cmd3.CommandText = "select * from t_titles";
cmd3.Connection = con;
adapter3.SelectCommand = cmd3;

adapter.Fill(ds, "t_books");
adapter2.Fill(ds, "t_sessions");
adapter3.Fill(ds, "t_titles");

DataRelation dataRelation;
DataRelation dataRelation2;

DataColumn dc1 = ds.Tables["t_books"].Columns["bookID"];
DataColumn dc2 = ds.Tables["t_sessions"].Columns["bookID"];

DataColumn dc3 = ds.Tables["t_sessions"].Columns["sessionID"];
DataColumn dc4 = ds.Tables["t_titles"].Columns["sessionID"];

dataRelation = new DataRelation("Relation1", dc1, dc2);
dataRelation2 = new DataRelation("Relation2", dc3, dc4);
ds.Relations.Add(dataRelation);
ds.Relations.Add(dataRelation2);
TreeNode book;
TreeNode session;
TreeNode title;

foreach (DataRow row in ds.Tables["t_books"].Rows)
{
book = new TreeNode(string.Format("{0}", (string)row["bookName"]));
book.Tag = row;
ds.Tables["t_sessions"].DefaultView.RowFilter = "bookID=" + row["bookID"];
for (int i = 0; i < ds.Tables["t_sessions"].DefaultView.Count; i++)
{
DataRowView sessionRow = ds.Tables["t_sessions"].DefaultView[i];
session = new TreeNode(string.Format("{0}", (string)sessionRow["sessionName"]));
session.Tag = sessionRow;

ds.Tables["t_titles"].DefaultView.RowFilter = "sessionID=" + sessionRow["sessionID"];
for (int j = 0; j < ds.Tables["t_titles"].DefaultView.Count; j++)
{
DataRowView titleRow = ds.Tables["t_titles"].DefaultView[j];
title = new TreeNode(string.Format("{0}", (string)titleRow["titleName"]));
title.Tag = titleRow;

session.Nodes.Add(title);
}

book.Nodes.Add(session);
}
this.treeView1.Nodes.Add(book);
}

مرسی

Sorenaa_s
یک شنبه 23 اردیبهشت 1386, 12:29 عصر
public static void LoadTree( TreeView tree)
{
string cnnString = "workstation id=GHAFFARI;packet size=4096;integrated security=SSPI;initial catalog=TempDataBase;persist security info=False";
SqlConnection con = new SqlConnection( cnnString );
DataSet ds = new DataSet();
if( con.State != ConnectionState.Open )
con.Open();
SqlCommand cmd = null;
SqlDataAdapter adapter = null;


cmd = new SqlCommand( "select * from t_books", con );
adapter = new SqlDataAdapter( cmd );
adapter.Fill( ds, "t_books" );
cmd = new SqlCommand( "select * from t_sessions", con );
adapter = new SqlDataAdapter( cmd );
adapter.Fill(ds, "t_sessions");
cmd = new SqlCommand( "select * from t_titles", con );
adapter = new SqlDataAdapter( cmd );
adapter.Fill(ds, "t_titles");
TreeNode book;
TreeNode session;
TreeNode title;
foreach( DataRow row in ds.Tables["t_books"].Rows )
{
book = new TreeNode( (string)row["bookName"] );
book.Tag = row;
ds.Tables["t_sessions"].DefaultView.RowFilter = "bookID=" + row["bookID"];
for (int i = 0; i < ds.Tables["t_sessions"].DefaultView.Count; i++)
{
DataRowView sessionRow = ds.Tables["t_sessions"].DefaultView[i];
session = new TreeNode( (string)sessionRow["sessionName"] );
session.Tag = sessionRow;
ds.Tables["t_titles"].DefaultView.RowFilter = "sessionID=" + sessionRow["sessionID"];
for (int j = 0; j < ds.Tables["t_titles"].DefaultView.Count; j++)
{
DataRowView titleRow = ds.Tables["t_titles"].DefaultView[j];
title = new TreeNode( (string)titleRow["titleName"] );
title.Tag = titleRow;
session.Nodes.Add(title);
}
book.Nodes.Add(session);
}
tree.Nodes.Add(book);
}
}


------ SQL Script


CREATE TABLE [dbo].[t_books] (
[bookID] [numeric](18, 0) IDENTITY (1, 1) NOT NULL ,
[BookName] [nvarchar] (50) COLLATE Arabic_CI_AS NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[t_sessions] (
[SessionID] [numeric](18, 0) IDENTITY (1, 1) NOT NULL ,
[SessionName] [nvarchar] (50) COLLATE Arabic_CI_AS NULL ,
[BookID] [numeric](18, 0) NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[t_titles] (
[titleID] [numeric](18, 0) IDENTITY (1, 1) NOT NULL ,
[titleName] [nvarchar] (50) COLLATE Arabic_CI_AS NULL ,
[sessionID] [numeric](18, 0) NULL
) ON [PRIMARY]
GO




راستش مشکل کد شما رومتوجه نشدهم، ولی این کد ( کد تغییر داده شه کد شماست ) درست اجرا شد. شما هم تستش کن.

hdv212
یک شنبه 23 اردیبهشت 1386, 15:55 عصر
دستت درد نکنه، خیلی زحمت کشیدی، تستش میکنم، بازم ممنون

hdv212
یک شنبه 23 اردیبهشت 1386, 16:04 عصر
Sorenaa_s عزیز ممنونم ازت، همون مال خودمم درست بود، فقط توی خوندن اطلاعات، بی دقتی کرده بودم، به هر حال یه دنیا ممنون، امیدوارم جبران کنم.

Sorenaa_s
یک شنبه 23 اردیبهشت 1386, 16:59 عصر
خواهش میکنم، گفتم که من تغییر خاصی ندادم تو کد شما