PDA

View Full Version : grid



ara12345
سه شنبه 30 مرداد 1386, 14:07 عصر
سلام
من در برنامه ام کابر اطلاعاتی را که وارد می کنه در دیتابیس SQL2005 نوشته می شود حالا می خوام آنرا در گرید نمایش بدم ولی نمی دونم کانکشن چندتا باید درست کنم چون یکی قبلا برای Insert کردن درست کردم ولی آیا باید یکی هم برای گرید بنویسم یا این دوتا باید با هم فرق داشته باشه؟
در ضمن با یک Tabl هم بزای گریدم توی دیتابیس بسازم؟

string sSelectSQL = "SELECT id as Name FROM Datagrid ";
SqlCommand SCmdDataG = newSqlCommand(sSelectSQL,scnn);
SqlDataAdapter sdacloths = newSqlDataAdapter("Select * from Datagrid",scnn );
scnn.Open();
DataSet dscloths = newDataSet();
dscloths.Rows[index].Dispose();
sdacloths.Fill(dscloths, "DataGrid");
dataGridView1.DataSource = dscloths.DefaultViewManager;

PC2st
سه شنبه 30 مرداد 1386, 14:36 عصر
نمی دونم کانکشن چندتا باید درست کنم
یک کانکشن کافیست، با همون یکی هم Insert هم Delete هم Update و بقیه کارها رو انجام میدم.


در ضمن با یک Tabl هم بزای گریدم توی دیتابیس بسازم؟
بله، باید بسازید.

برای اتصال دیتاست به dataGridView1 هم مثل زیر مینویسیم:


dataGridView1.DataSource = dscloths;
dataGridView1.DataMember = "DataGrid";

که DataGrid همون نامی است که در حین Fill کردن مشخص کردی.




dscloths.Rows[index].Dispose();
فلسفه وجودی این خط رو نفهمیدم، ولی احتیاج به این نیست و همچنین نیازی به متد scnn.Open نیست، چون متد Fill خودش کانکشن رو Open میکنه.

ara12345
سه شنبه 30 مرداد 1386, 14:46 عصر
بله، باید بسازید.

برای اتصال دیتاست به dataGridView1 هم مثل زیر مینویسیم:


dataGridView1.DataSource = dscloths;
dataGridView1.DataMember = "DataGrid";

مرسی
این کدها را بهتره کجا بنویسم؟
کدهای Insert را درون کلید نوشتم ولی کد مربوط به گرید که براتون فرستادم را در Form Load نوشتم درسته؟
در ضمن کد شما رو که در بالا برام نوشتید را کدوم قسمت بنویسم؟

sm_ezadpanah
سه شنبه 30 مرداد 1386, 15:08 عصر
با سلام بستگی داره کی می خوای اونا نمایش داده شه . ولی معمولا توی لود فرم اینکار می کنن

PC2st
سه شنبه 30 مرداد 1386, 15:13 عصر
این کدها را بهتره کجا بنویسم؟
بهتره در متد سازنده کلاس (مثلا متد Form1) بعد از خط صدا زدن متد InitializeComponent بنویسید.



کدهای Insert را درون کلید نوشتم ولی کد مربوط به گرید که براتون فرستادم را در Form Load نوشتم درسته؟
درسته.


در ضمن کد شما رو که در بالا برام نوشتید را کدوم قسمت بنویسم؟
مثلا به شکل زیر باید بنویسید تا اطلاعات از بانک خونده بشه و در دیتاست Fill بشه و دیتاست رو به DataGridView متصل کنیم تا داده ها رو به کاربر نمایش بدیم، که این کارها رو در داخل متد سازنده یا رویداد Form Load نوشت که من این رو در متد سازنده انجام میدم:


public partial class Form1 : Form
{
//اشیائی که بعد بهشون احتیاج داریم، برای وقتی که میخوایم بانک اطلاعاتی رو تغییر بدیم.
SqlConnection scnn;
SqlDataAdapter sdacloths;

//دیتاست رو میشد بصورت یک فیلد تعریف نکرد، اما اگر بصورت فیلد تعریف بشه، بهتره.
DataSet dscloths;

public Form1()
{
InitializeComponent();

//ایجاد شیئ ارتباط برقرار کننده با دیتابیس
this.scnn = new SqlConnection("your connection string");
this.sdacloths = new SqlDataAdapter("Select * from Datagrid", scnn);

//چرا این خطوط رو نوشتید؟
string sSelectSQL = "SELECT id as Name FROM Datagrid";
SqlCommand SCmdDataG = new SqlCommand(sSelectSQL, scnn);
//پایان خطوطی که دلیل وجودشون رو نمیدونستم

//این خط لازم نیست.
scnn.Open();


this.dscloths = new DataSet();

//این خط اصولا اشتباه است.
dscloths.Rows[0].Dispose();

//پر کردن دیتاست
sdacloths.Fill(dscloths, "DataGrid");

//اتصال دیتاگریدویو به دیتاست
dataGridView1.DataSource = dscloths;
dataGridView1.DataMember = "DataGrid";
}
}

توضیحات لازم رو در بین کدها نوشتم.

hdv212
سه شنبه 30 مرداد 1386, 15:15 عصر
بهتره که کدهای مربوط به نمایش داده ها رو در داخل تابعی مثلا با نام LoadData() بنویسید که هر جا که خواستید اطلاعات رو نمایش بدید (مثل باز شدن فرم، یا پس از insert,update,delete کردن رکورد که بایستی اطلاعات جدید بعد از تغییرات نمایش داده بشن)، مجبور نباشید هی کد ها رو در جاهای مختلف copy/paste کنید.

Beatles
سه شنبه 30 مرداد 1386, 16:34 عصر
این کدها را بهتره کجا بنویسم؟

برای نوشتن برنامه ای که براحتی بتونیم اون رو Debug کنیم بهتره که برنامه لایه های مختلفی داشته باشه و کدهایی که کارشان شبیه به هم هست در یک لایه نگهداری شوند بدین منظور معمولا سه لایه User Interface , Business Services و Data Services پیشنهاد میشوند.
در مورد سئوال شما بنظر میرسه که نوشتن کدهای مرتبط به DB بهتره در لایه Data Services نوشته بشه برای این منظور Pattern هم وجود دارد که به آن DAO(Data Access Objects) میگویند و مطابق این Pattern برای هر یک از object هایی که در data model وجود دارند یک object از نوع DAO تعریف میشود که برنامه از طریق آنها کارهای مربوطه را انجام میدهد
برای اطلاعات بیشتر میتونید به اینجا (http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html)مراجعه کنید

MH2538
سه شنبه 30 مرداد 1386, 16:34 عصر
سلام
من یک بار قبلاً توی یکی از همین پست ها گفته بودم که دوستان عزیز در اکثر موارد بعد از insert
نیازی به Selectکردن نیست.
اینکار باعث ایجاد سربار روی شبکه می شه.
بجای اینکار بعد از کنترل اینکه عمل insert با موفقیت انجام شده باید یک سطر به سطرهای دیتاستتون اضافه کنید(البته نه از Select کردن).با اینکار اون سطر جدید خودبخود نمایش داده خواهدشد.
اگر شما بخواهید برای یک دیتاگرید که مثلاً 1000 تا رکرود داره این کار رو بکنید و هر بار هم که یک Insert انجام میدهید اینکار رو بکنید هم پهنای باند رو اشغال می کنید هم سرور دیتابیس رو مشغول می کنید ضمن اینکه نمایش اطلاعات هم هربار کندتر از دفعه قبل میشه

hdv212
سه شنبه 30 مرداد 1386, 19:33 عصر
MH2538 عزیز ایده ی جالبی دادی، ولی زمانی که شما در زمان insert کردن از تراکنش استفاده میکنی تا چندین insert رو انجام بدی، و اینکه load شدن داده ها ممکنه از چندین Select و join کردن جدولهای مختلف انجام بشه، چطوری میخوای به دیتاستت یه رکورد اضافه کنی ؟ تازه ممکنه احتمال بروز خطا خیلی زیاد بشه.

MH2538
چهارشنبه 31 مرداد 1386, 09:14 صبح
سلام
اینکار 100٪ انجام شدنیه و من الان توی خیلی از پروژه هام که دست بر قضا اتوماسیون صنعتی است و صحت تبادل اطلاعات توی اونها بسیاربسیار مهمه از همین روش استفاده می کنم.
اما قضیه Join ، شما یک Datarow از روی Ds.Tables[0].Row بساز هر چیزی بخوای می تونی توش بریزی کاری هم به Join بودن نداره. دیتاست محلی درحافظه برای نمایش اطلاعاتی است که توسط DataAdapter و به واسه Command به سیستم منتقل شده است.
اگر هم خیلی اصرار دارید که نمی شه من یک پروژه بنویسم بفرستم.

ara12345
چهارشنبه 31 مرداد 1386, 11:28 صبح
[/code]
توضیحات لازم رو در بین کدها نوشتم.[/quote]
سلام
مرسی از جوابتون
ولی نمی دونم چرا برنامه من وقتی Run می کنم Exception داره :
Connectio9n property has not been initialized

MH2538
چهارشنبه 31 مرداد 1386, 11:40 صبح
سلام
ظاهراً کانکشن استرینگ رو برای کانکشنتوت ست نکردید
cn.ConnectionString

ara12345
چهارشنبه 31 مرداد 1386, 11:42 صبح
Exception دارم: در کد:

this.scnn = newSqlConnection(strConn);

Format of the initialization string does not conform to specification starting at index 44.

hdv212
چهارشنبه 31 مرداد 1386, 14:22 عصر
اینکار 100٪ انجام شدنیه و من الان توی خیلی از پروژه هام که دست بر قضا اتوماسیون صنعتی است و صحت تبادل اطلاعات توی اونها بسیاربسیار مهمه از همین روش استفاده می کنم.
اما قضیه Join ، شما یک Datarow از روی Ds.Tables[0].Row بساز هر چیزی بخوای می تونی توش بریزی کاری هم به Join بودن نداره. دیتاست محلی درحافظه برای نمایش اطلاعاتی است که توسط DataAdapter و به واسه Command به سیستم منتقل شده است.
اگر هم خیلی اصرار دارید که نمی شه من یک پروژه بنویسم بفرستم.

اگه امکانش هست یه نمونه بذار توی جداولی که با هم Relation دارن، ایده ی جالبیه ... ممنونت میشم.

PC2st
چهارشنبه 31 مرداد 1386, 14:50 عصر
Exception دارم: در کد:

this.scnn = newSqlConnection(strConn);

Format of the initialization string does not conform to specification starting at index 44.

مشکل در connection string است، میگه فرمت قالب بندی رشته با شروع اندیس 44 مطابقت نداره!