PDA

View Full Version : fillingDataGrid



mina1363
چهارشنبه 31 مرداد 1386, 14:03 عصر
سلام
من یک کلاس connection دارم که دو تا پارامتر رو میگیره و یک dataset برمیگردونه یعنی باید این کار رو انجام بده که این dataset رو میخوام برای datagrid بنویسمش ولی ارور زیر رو میده :
Error 1 'Connection': member names cannot be the same as their enclosing

متن کلاس هم این است :

classConnection

{
publicstring StoredPName;
publicstring DGName;
publicDataSet Connection(string StoredPName,string DGName) {
SqlConnection cn = newSqlConnection();
cn.ConnectionString = "Data Source=.;Initial Catalog=Ghazalnama;Integrated Security=True";
SqlCommand cmd = newSqlCommand();
cmd.Connection = cn;
SqlDataAdapter da = newSqlDataAdapter(cmd);
DataSet ds = newDataSet();

cn.Open();
cmd.CommandType = CommandType.StoredProcedure;
StoredPName1 = StoredPName;
cmd.CommandText = StoredPName1;
//cmd.ExecuteNonQuery();

DGName1 = DGName;
da.TableMappings(DGName1);
da.Fill(ds, StoredPName1);


cn.Close();

this.StoredPName = StoredPName;
this.DGName = DGName;
}
publicstring StoredPName1
{

get{
return StoredPName;

}
set {
if(this.StoredPName!=value)
this.StoredPName = value;

}

}
publicstring DGName1 {
get {
return DGName;
}
set {
if (this.DGName != value)
this.DGName = value;
}
}

که DGName نام table در دیتا بیسم است و StoredPName نام storedprocedure در دیتا بیسم است

و کدی که مقابل datagrid نوشته ام این است :

Connection connect = newConnection();
dataGridView1.DataSource = connect.Connection();
connect.StoredPName1 = "sp_selectGhazal2Hafez";
connect.DGName1 = "Ghazal2Hafez";

من خیلی وقت است که درگیر این هستم ولی درست نشده اگه میشه بگید اشکال کار کجاست ؟:لبخندساده:

mehdi.mousavi
چهارشنبه 31 مرداد 1386, 14:14 عصر
سلام
من یک کلاس connection دارم که دو تا پارامتر رو میگیره و یک dataset برمیگردونه یعنی باید این کار رو انجام بده که این dataset رو میخوام برای datagrid بنویسمش ولی ارور زیر رو میده :
Error 1 'Connection': member names cannot be the same as their enclosing




سلام.
Constructor کلاس Connection خودتونو اینطوری نوشتید:


public DataSet Connection()کلمه DataSet رو حذف کنید، درست میشه.

mina1363
چهارشنبه 31 مرداد 1386, 15:15 عصر
نه دیگه نوشتم:
public Dataset Connection() و...

PC2st
چهارشنبه 31 مرداد 1386, 15:37 عصر
نه دیگه نوشتم:
public Dataset Connection() و...

جناب mehdi6755 درست گفتند، نباید نوعی را برای سازنده مشخص کرد، به شکل زیر باید بنوسید:


public Connection()
{
و ...
}

mina1363
چهارشنبه 31 مرداد 1386, 16:32 عصر
آهان یعنی نباید اون Dataset رو اونجا بنویسم درسته؟
خوب پس چطوری میتونم بگم که این دیتاگرید رو پر کنه ؟

mina1363
چهارشنبه 31 مرداد 1386, 16:47 عصر
خوب اینطوری که گفتید نوشتم و حالا جایی که از کلاسم instance ساختم اونجا بهم ارور زیر رو میده :
Error 1 'TestDatagridView.Connection' does not contain a definition for '
و اونجا اینو نوشتم :
Connection connect = newConnection("sp_selectGhazal1Hafez", "Ghazal1Hafez");
dataGridView1.DataSource = connect.Connection("sp_selectGhazal1Hafez", "Ghazal1Hafez");
connect.StoredPName1 = "sp_selectGhazal1Hafez";
connect.DGName1 = "Ghazal1Hafez";

PC2st
چهارشنبه 31 مرداد 1386, 16:56 عصر
بجای اینکه از متد Connection برای دریافت دیتاست اقدام کنید، از یک متد دیگر با نام دیگری استفاده کنید. مثلا نام متد رو بگذارید GetDataSource و برنامه اصلی رو هم به شکل زیر تغییر بدید:


Connection connect = new Connection("sp_selectGhazal1Hafez", "Ghazal1Hafez");
dataGridView1.DataSource = connect.GetDataSource();
connect.StoredPName1 = "sp_selectGhazal2Hafez";
connect.DGName1 = "Ghazal2Hafez";


یا کلاستون رو بطوری تغییر بدید که به شکل زیر ازش استفاده بشه:


Connection connect = new Connection();
dataGridView1.DataSource = connect.GetDataSource("sp_selectGhazal1Hafez", "Ghazal1Hafez");
connect.StoredPName1 = "sp_selectGhazal2Hafez";
connect.DGName1 = "Ghazal2Hafez";

hdv212
چهارشنبه 31 مرداد 1386, 16:57 عصر
کدی که شما نوشتید، کمی گنگ به نظر میرسه!
اولا اینکه تابع سازنده ی کلاستون که همون Connection هست نباید مقدار بازگشتی داشته باشه، پس باید به صورت زیر اصلاحش کنید :

public Connection(string StoredPName, string DGName)
{
// code
}
بعدشم اینکه در قسمتی که شما از این کلاس، آبجکت ساختید، باید به سازنده ای کلاستون، دو تا پارامتر ارسال کنید(طبق تعریف خودتون)، یعنی باید بنویسی :

Connection connect = new Connection("sp_selectGhazal2Hafez", "Ghazal2Hafez");
نظر من اینه که یه متد دیگه در داخل کلاست تعریف کنی، مثل GetData و تمام کارهایی رو که سازنده ی کلاست کردی، با این بکنی(این متد پارامتر بگیره و دیتاست برگردونه)، یعنی به این صورت میتونی بنویسی :

public DataSet GetData(string StoredPName, string DGName)
{
DataSet ds = new DataSet();
// Do someCode here ...
return ds;
}
و اینطوری هم میتونی در کدت استفاده کنی، البته من سازنده ی کلاستو بدون پارامتر در نظر گرفتم :

Connection connect = new Connection();
this.dataGridView1.DataSource = connect.GetData("sp_selectGhazal2Hafez", "Ghazal2Hafez").Tables[0].DefaultView;

mina1363
چهارشنبه 31 مرداد 1386, 19:53 عصر
ممنونم این GetDataset همون متد دیگه ای است که میگید باید جدید اضافه کنم به متد connection ?

mina1363
چهارشنبه 31 مرداد 1386, 20:22 عصر
جناب PC2st.ir کلاس را تغییر دادم به شکل زیر :
public Connection()
{

}
publicDataSet GetDatasource(string StoredPName, string DGName) {

SqlConnection cn = newSqlConnection();
cn.ConnectionString = "Data Source=.;Initial Catalog=Ghazalnama;Integrated Security=True";
SqlCommand cmd = newSqlCommand();
cmd.Connection = cn;
SqlDataAdapter da = newSqlDataAdapter(cmd);
DataSet ds = newDataSet();
cn.Open();
cmd.CommandType = CommandType.StoredProcedure;
StoredPName1 = StoredPName;
cmd.CommandText = StoredPName1;
DGName1 = DGName;
da.Fill(ds, DGName1);
cn.Close();
this.StoredPName = StoredPName;
this.DGName = DGName;
return ds;

}

و در برنامه اصلی همونی که شما گفتید :
Connection connect = new Connection();
dataGridView1.DataSource = connect.GetDataSource("sp_selectGhazal1Hafez", "Ghazal1Hafez");
connect.StoredPName1 = "sp_selectGhazal2Hafez";
connect.DGName1 = "Ghazal2Hafez";


ولی حالا ارور نمیده موقع اجرا یک ArgumentException Unhandled اتفاق افتاد که پیام زیر رو میده :


Child list for field sp_selectGhazal1Hafez cannot be created.

PC2st
چهارشنبه 31 مرداد 1386, 22:53 عصر
میشه بگید اون خطا رو روی چه خطی میگیره؟ روی خط زیر خطا میگیره؟


da.Fill(ds, DGName1);

hdv212
چهارشنبه 31 مرداد 1386, 23:34 عصر
mina1363 جان کدت رو خیلی پیچیده کردی، دلیل وجود برخی از پارامترها رو هم در کلاست متوجه نشدم ولی تابع GetDatasource رو به صورت زیر اصلاح کردم :

public DataSet GetDatasource(string StoredPName, string DGName)
{
this.StoredPName = StoredPName;
this.DGName = DGName;
StoredPName1 = StoredPName;
DGName1 = DGName;

SqlConnection cn = new SqlConnection();
cn.ConnectionString = "Data Source=.;Initial Catalog=Ghazalnama;Integrated Security=True";
SqlCommand cmd = new SqlCommand();
cmd.Connection = cn;
cmd.CommandText = StoredPName1;
cmd.CommandType = CommandType.StoredProcedure;
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds, DGName1);
return ds;
}

برای استفاده از کلاست هم اینطوری عمل کن :

Connection connect = new Connection();
dataGridView1.DataSource = connect.GetDatasource("sp_selectGhazal1Hafez", "Ghazal1Hafez").Tables[0].DefaultView;
احتمالا مشکلت حداقل از بابت کدنویسی حل میشه، اگه باز مشکلی باشه، از سمت دیتابیست هست.

mina1363
پنج شنبه 01 شهریور 1386, 04:57 صبح
نه روی این خط :
dataGridView1.DataMember = connect.StoredPName1 = "sp_selectGhazal1Hafez";

mina1363
پنج شنبه 01 شهریور 1386, 05:37 صبح
وقتی که این
dataGridView1.DataSource = connect.DGName1 = "Ghazal1Hafez";
dataGridView1.DataMember = connect.StoredPName1 = "sp_selectGhazal1Hafez";
دو خط کد رو نمی نویسم وبا breakpoint اجرا میگیرم اصلا نام table , storeprocedure رو نمی خونه ولی وقتی مینویسم میخونتشون ولی وارد کلاس نمیشه:متفکر:

PC2st
پنج شنبه 01 شهریور 1386, 12:06 عصر
dataGridView1.DataSource = connect.DGName1 = "Ghazal1Hafez";
DataSource باید به یک شیئ اشاره کنه نه به یک رشته.
باید به شکل زیر استفاده کنید البته اگر هنوز متد GetDataSource در کلاستون وجود داشته باشه:


dataGridView1.DataSource = connect.GetDataSource("sp_selectGhazal1Hafez", "Ghazal1Hafez");
dataGridView1.DataMember = connect.DGName1;

mina1363
پنج شنبه 01 شهریور 1386, 22:12 عصر
مرسی واقعا مرسی درست شد
حالا یه سوال دیگه و اون این که دو تا دکمه دارم یکی برای غزل بعدی و یکی برای غزل قبلی که وقتی روی اینها کلیک میکنم محتوای دیتا بیس رو دیتا گرید نشون میده مسئله ام اینه که این دکمه های غزل بعدی و قبلی دقیقا پشت سر هم درست کار میکنند اسم این غزل ها داخل یک combo است وقتی مثلا از غزل 3 روی دکمه بعدی کلیک میکنم تا آخر هی درست نشون میده ولی وقتی روی غزل 4 یکهو میرم روی غزل 6 کلیک میکنم اطلاعاتش را میبینم ولی وقتی روی دکمه غزل قبلی کلیک میکنم به جای غزل5 یا غزل 1 رو نشون میده یا 2 را هیچی برای ایک کار از countenext , counterprev استفاده کردم
نمیدونم تونستم مسئله ام رو درست مطرح کنم یا نه؟

PC2st
پنج شنبه 01 شهریور 1386, 22:43 عصر
برای رفتن به غزل قبلی و بعدی بهتره از خاصیت BindingContext استفاده کنید.
فهمیدم طرح مسئله چیه، اون قسمت از کدی که باهاش به غزل قبلی می روید رو اگه ممکنه بگذارید؟

mina1363
جمعه 02 شهریور 1386, 07:46 صبح
آهان آخه bindingContext فقط برای یک table نیست؟ این غزل ها توی table های مختلف هستند که از این راه استفاده کردم
و این اولین دستور از غزل قبلی است
if (prevcount == 6) {
dataGridView1.Visible = true;
//cn.Open();
cmd.CommandText = "sp_selectGhazal5Hafez";
cmd.ExecuteNonQuery();
da.Fill(ds, "sp_selectGhazal5Hafez");
dataGridView1.DataSource = ds;
dataGridView1.DataMember = "sp_selectGhazal5Hafez";
count = 5;
prevcount--;
این فقط برای یک قسمتش است بقیه هم مثل همین است تعداد کل غزل ها 6 تاست
این هم آخرین دستور از غزل بعدی
elseif (count == 5) {
dataGridView1.Visible = true;
//cn.Open();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "sp_selectGhazal6Hafez";
cmd.ExecuteNonQuery();
da.Fill(ds, "sp_selectGhazal6Hafez");
dataGridView1.DataSource = ds;
dataGridView1.DataMember = "sp_selectGhazal6Hafez";
//cn.Close();
count++;
prevcount = 6;
}

PC2st
جمعه 02 شهریور 1386, 11:18 صبح
به این روش استفاده نکنید بهتره،
- یک ComboBox دارید که لیست غزلها در اون وجود داره.
- با کلیک روی هر Item از آن ComboBox، باید محتویات همان غزل در DataGridView به نمایش در بیاد.
- با کلیک روی بعدی و قبلی، باید گزینه های ComboBox به غزل بعدی یا غزل قبلی تغییر پیدا کنه.

با توجه به شرایط بالا و کدهایی که گذاشتید، به این نتیجه میرسیم که با تغییر گزینه انتخاب شده از ComboBox باید توسط یک SP رکوردهای جدید رو خونده و در DataGridView نمایش داد. پس بیشترین کارها رو ComboBox انجام میده.

در رویداد SelectedItemChanged از ComboBox، اطلاعات DataGridView رو باید بروزرسانی کنیم، به شیوه ای که کمترین کد لازم باشه، مثلا مثل زیر:


dataGridView1.Visible = true;
cmd.CommandText = "sp_selectGhazal" + (int)(comboBox1.SelectedIndex + 1).ToString() + "Hafez";

//چه نیازی به این خط هست؟؟؟
cmd.ExecuteNonQuery();

da.Fill(ds, cmd.CommandText);
dataGridView1.DataSource = ds;
dataGridView1.DataMember = cmd.CommandText;

چیزی شبیه به کدهای فوق رو باید بنویسید، البته در صورتی که نام غزلها تناظر یک به یک با نام SP ها داشته باشند، (مثلا غزل 2 باید از طریق sp_selectGhazal2Hafez دریافت بشه و همچنین اگر غزل 2 بعنوان دومین گزینه در ComboBox1 قرار داشته باشه، و گرنه یک خورده باید کدها رو دستکاری کرد)

خوب تمام! فقط این مونده که دکمه های "قبلی" و "بعدی" رو پیاده سازی کنیم، مثلا برای دکمه "بعدی":


if(comboBox1.SelectedIndex < comboBox1.Items.Count - 1)
comboBox1.SelectedIndex++;
else
comboBox1.SelectedIndex = 0;

و برای دکمه "قبلی"، برعکسش رو انجام میدیم.

نیازی هم به استفاده از BindingContext نبود، چون برنامه کار دیگه ای انجام میده و ComboBox لازم نیست به چیزی متصل باشه.

mina1363
شنبه 03 شهریور 1386, 14:56 عصر
با این روش مسئله حل شد ولی
من دیتا بیسی که دارم 10 تا شاعر با 10 جلد کتاب آنها شما این دیتا بیس رو چطور طراحی میکنید ؟ هر جلد کتاب دارای چندین غزل هستند که هر کدام دارای نام مجزا می باشند

hdv212
شنبه 03 شهریور 1386, 16:06 عصر
من یه پروژه ای قبلا کار میکردم که بی ربط به پروژه ی شما نیست، اونم یه سری مجوعه کتاب بود برای مولفین، ما این جداول رو طراحی کردیم :
Collections : که فقط اطلاعاتی راجع به مجموعه کتابهایی که یه مولف یا مولفانی نوشته اند به ما میداد.
Books : که اطلاعات کتابها رو ذخیره میکرد و اینکه عضو کدوم مجموعه بود.
Authors : که اطلاعات مولفان رو ذخیره میکرد و اینکه کدوم مجموعه رو تالیف کرده بود.
Pubs : که اطلاعات انتشارات رو ذخیره میکرد و اینکه کدوم مجموعه رو منتشر کرده بود.
Sections : که بخشهای کتاب رو ذخیره میکرد و اینکه عضو کدوم کتاب بود.
Sessions : که سرفصل های کتاب رو ذخیره میکرد و اینکه عضو کدوم بخش بود.
Titles : که عناوین یا موضوعات کتاب رو ذخیره میکرد و اینکه عضو کدوم فصل بود.
Footers : که پاورقی ها رو در خودش ذخیره میکرد و اینکه عضو کدوم عنوان بود.

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

mina1363
شنبه 03 شهریور 1386, 18:59 عصر
نه دیتا بیس من با اون چیزی که در پست قبل گفته شد فرق دارد جناب PC2st.ir میشه راهنمایی کنید ؟

PC2st
شنبه 03 شهریور 1386, 19:45 عصر
یک جدول بنام Shaaer برای نگهداشتن لیست شاعران که این جدول دو فیلد داره بنامهای ID و AuthorName. که فیلد AuthorName (از نوع متن) برای نگهداری نام شاعر بکار میره و فیلد ID (از نوع عدد) برای ارتباط با دیگر جداول بکار میره. (هر رکورد معرف یک شاعر خواهد بود)
یک جدول بنام Ketaab که برای نگهداشتن لیست کتابها بکار میره و این جدول سه فیلد باید داشته باشه، فیلد BookTitle برای نگهداشتن عنوان کتاب و فیلدهای BookID و ID برای ارتباط با دیگر جداول بکار میروند. (هر رکورد معرف یک کتاب خواهد بود)
جدول Ghazalhaa هم برای لیست غزلها به کار میره، که دارای فیلدهای BookID و GhazalName و Sher هست. فیلد GhazalName برای ذخیره سازی نام غزل بکار میره و فیلد BookID هم برای ایجاد ارتباط با دیگر جداول. فیلد Sher هم برای نگهداری محتوای ابیات داخل غزل بکار میره. (در این جدول، هر رکورد معرفی یک غزل خواهد بود)

پس اینکه جدول ها ساخته شد، نوبت به ایجاد رابطه بین اونها میرسه...
(اگر بنویسم Table1.Field1 یعنی فیلد Field1 از جدول Table1)

فیلد Shaaer.ID باید بصورت Primary Key باشد (و به طوری که نشه مقادیر این فیلد Duplicate بشه یعنی دوبار تکرار بشه).
فیلد Ketaab.BookID باید بصورت Primary Key باشد.

بین فیلد Shaaer.ID و فیلد Ketaab.ID یک رابطه از نوع یک به چند (One to Many) ایجاد کنید.
بین فیلد Ketaab.BookID و فیلد Ghazalhaa.BookID یک رابطه از نوع یک به چند (One to Many) ایجاد کنید.

حالا لیست شاعران در جدول Shaaer هست که یک فیلد ID در این جدول وجود داره که برای متمایز کردن نام شاعران و ایجاد ارتباط بکار میره. (هر شاعر یک ID مخصوص به خود را داره)
در جدول Ketaab هم لیست کتابها قرار داره که هر رکورد معرف کننده یک کتاب هست، در این جدول، مقدار فیلد ID میتونه تکراری باشه (چون هر شاعر میتونه چند کتاب رو نوشته باشه) ولی مقدار فیلد BookID نمیتونه تکراری باشه.

برای جدول Ghazalhaa هر رکورد دارای سه فیلد هست که فیلد BookID مشخص میکنه این غزل مربوط به کدام کتاب میشه (این فیلد میتونه تکراری باشه چون هر کتاب میتونه شامل چندین غزل باشه) و فیلد GhazalName که نام غزل رو مشخص میکنه و فیلد Sher هم یک فیلد با حجم زیادی خواهد بود که کل ابیات یک غزل در اون قرار میگیره.
البته برای جدول Ghazalhaa میشد به شیوه دیگری هم عمل کرد و آن اینکه به هر غزل یک ID بدیم (مثلا فیلد GhazalID) و یک جدول دیگه ایجاد کنیم که بر اساس اون غزلها، ابیات در هر رکورد نوشته شده باشند.

میتونستید برای ایجاد ارتباط بین بانکها از فیلد ID یا BookID یا ... استفاده نکنید و از همان فیلدهای AuthorName و BookTitle و ... برای ایجاد ارتباط بین جداول استفاده کنید، مثلا فیلد AuthorName از جدول Shaaer رو به فیلدی به همین نام از جدول Ketaab ارتباط میدادید (از نوع یک به چند) که در اینصورت نیازی به فیلد ID در جدول Shaaer و Ketaab نبود. اما فکر کنم اگر از فیلدی مثل ID و BookID استفاده بشه، بهتره، چون این فیلدها از نوع عدد هستند و سرعت بیشتری دارند!

mina1363
یک شنبه 04 شهریور 1386, 13:49 عصر
میشه جدول غزلها فیلد شعرش رو به دو فیلد مصرع1 و مصرع 2 تغییر بدیم؟
حالا اگر بخوام از بین همه این سطر شعرها که توی دیتا بیس است یکی به طور رندم توی textbox نشون داده بشه مگه نباید به هر سطر شعری در دیتا بیس یک فیلد شماره سطر هم داشته باشم که بتونم از تابع Random استفاده کنم ؟ برای این چه پیشنهادی میدهید؟

PC2st
یک شنبه 04 شهریور 1386, 16:52 عصر
میشه جدول غزلها فیلد شعرش رو به دو فیلد مصرع1 و مصرع 2 تغییر بدیم؟
میشه.




بتونم از تابع Random استفاده کنم ؟ برای این چه پیشنهادی میدهید؟
لازم به فیلد دیگری برای این کار نیست اگر تمام اشعار در یک dataTable یا dataSet قرار گرفته اند، یک عدد تصادفی ایجاد میکنی و اون عدد تصادفی رو بعنوان شماره سطر به خاصیت Rows میدید.

mina1363
یک شنبه 04 شهریور 1386, 21:08 عصر
لازم به فیلد دیگری برای این کار نیست اگر تمام اشعار در یک dataTable یا dataSet قرار گرفته اند، یک عدد تصادفی ایجاد میکنی و اون عدد تصادفی رو بعنوان شماره سطر به خاصیت Rows میدید.

خوب حالا چطوری میتونم اینها رو بریزم توی دیتا ست؟
نه اگر دیتا بیسم اینطوری باشه که هر غزل رو توی یک جدول نوشته باشم کارم خیلی غلط است ؟
استفادۀ رندم برای این حالت چطوری میشه؟
من اومدم اول یک فیلد NumberOfRows تعریف کردم و بعد ازش select گرفتم بعد از این اعدادی که بدست آمد رندمش را با یک storedProcedure دومی فرستادم به دیتا بیس و اونو select کردم به نظرتون این خیلی غلط است؟
بهتره که دیتا بیسم رو به حالتی که شما گفتید تغییر بدم؟

PC2st
یک شنبه 04 شهریور 1386, 22:27 عصر
خوب حالا چطوری میتونم اینها رو بریزم توی دیتا ست؟
به روش های مختلفی میشه این کار رو کرد و بستگی داره،
میخوای که ارتباط بین جداول در dataSet هم وجود داشته باشه؟ در اینحالت باید از TableMapping و یا خاصیت Relations از دیتاست، استفاده کرد.
یا اینکه فقط میخواید اطلاعات رو دریافت کنید و به نمایش بگذارید؟ که در اینجالت از یک دستور SELECT مناسب استفاده میشه.


نه اگر دیتا بیسم اینطوری باشه که هر غزل رو توی یک جدول نوشته باشم کارم خیلی غلط است ؟
بستگی داره، آیا در لیست ابیات، میخوای جستجو کنی؟ میخوای کوئری بگیری؟ یا میخواید به تک تک بیتها دسترسی داشته باشید؟ یا ... اگر جواب مثبت بود، پس این کار رو بکنید البته نه اینکه برای هر غزل یک جدول، بلکه برای بیتهای غزلها یک جدول کافیه. در جدولی که نام غزلها هست، برای هر غزل یک فیلدی مثل GhazalID بگذارید (برای ایجاد ارتباط) و یک جدول دیگه بساز و در اون فیلد GhazalID و Beyt رو ایجاد کن، که فیلد Beyt برای ذخیره هر بیت بکار میره و فیلد GhazalID مشخص میکنه که اون بیت، مربوط به کدام غزل میشه. البته اینطوری ترتیب بین بیتها به هم میریزه که میتونی یک فیلد BeytID هم ایجاد کنی که از 1 تا ... باشه که برای ترتیب بیت ها بکار میره.
اما اگر فقط میخوای که ابیات رو از جدول بخونید، نیازی به ساخت جدول جدید برای هر غزل نیست.



من اومدم اول یک فیلد NumberOfRows تعریف کردم و بعد ازش select گرفتم بعد از این اعدادی که بدست آمد رندمش را با یک storedProcedure دومی فرستادم به دیتا بیس و اونو select کردم به نظرتون این خیلی غلط است؟
متاسفانه این قسمت رو نفهمیدم.


استفادۀ رندم برای این حالت چطوری میشه؟
بستگی داره، اگر میخوای که در اول برنامه، کل اطلاعات Database رو به dataSet منتقل کنید، یا اینکه در حین اجرای برنامه، میخوای به Database دسترسی داشته باشید و داده ها رو از Database بخونید و نمیخوای کل اطلاعات رو به dataSet منتقل کنید.
+ به فرض اینکه کل اطلاعات رو از بانک به dataSet ریختید، پس اگر بتوانید یک عدد random ایجاد کنید، اون عدد random حکایت یک شماره ی سطر رو داره و میتونید یک سطر رو بصورت Random بخونید. مثلا:


Random rnd = new Random();
string beyt = (string)dataSet1.Tables["TBLName"].Rows[rnd.Next(0, 100)].Cells["Beyt"].Value;

که مثلا TBLName نام جدولی هست که ابیات در آن قرار داره و فیلد Beyt هم فیلدی برای ابیات.

حالا مثلا اگر کل اطلاعات رو در یک dataSet نریخته باشیم و میخوایم یک رکورد رو بصورت random از دیتابیس بخونیم (به دیتابیس connect بشیم)، باید یک عدد از بصورت تصادفی بسازیم که اون عدد متناسب با یک فیلد از جدول در بانک باشه. مثلا فیلد ID رو در نظر بگیرید که اعدادش چهار رقمی باشه، اونوقت یک عدد random چهار رقمی رو ایجاد میکنیم و در SELECT نتیجه رکورد رو با شرط مثلا WHERE table1.ID = 3423 میگیریم.

mina1363
سه شنبه 06 شهریور 1386, 10:32 صبح
خوب حالا برای دکمه های غزل بعدی و قبلی که در چند پست گذشته جواب دادید اگر اسم همۀ storedprocedure ها پشت سر هم نباشند و لیست غزلها هم همشون در combo نباشد توی treeview باشد اون وقت برای دکمه های غزل بعدی و غزل قبلی چه راهی را پیشنهاد میدهید؟

PC2st
جمعه 16 شهریور 1386, 19:18 عصر
خوب حالا برای دکمه های غزل بعدی و قبلی که در چند پست گذشته جواب دادید اگر اسم همۀ storedprocedure ها پشت سر هم نباشند
در اینصورت به همان شیوه قبلی عمل کنید، یعنی اسم تک تک SP ها رو ذکر کنید (هر چند روش مناسبی نیست).




لیست غزلها هم همشون در combo نباشد توی treeview باشد اون وقت برای دکمه های غزل بعدی و غزل قبلی چه راهی را پیشنهاد میدهید؟
لیست غزلها اگر در tree view باشند، و اگر بخوایم که با انتخاب نام یک غزل از tree view، لیست بیت ها هم نمایش داده بشه، برای تشخیص اینکه کدام item یا غزل انتخاب شده، از رویداد AfterSelect استفاده میکنیم و از خاصیت e.Node.Text برای اینکه کدام item انتخاب شده.