PDA

View Full Version : سوال: بایند کردن اطلاعات به combobox با محدود کردن نمایش آنها



nadia_1987
یک شنبه 10 مرداد 1389, 00:30 صبح
سلام

دو تا combobox دارم که اولی لیست تمام رشته های درسی را نشون میده ( از دیتابیس میگیره)
میخوام به محض اینکه کاربر رشته مورد نظر را انتخاب کرد تمام درس های مربوط به اون رشته به combobox دوم بایند بشه .

چطوری میشه اینکار رو انجام داد ؟ میدونم باید query بنویسم اما نمیدونم چطوری؟؟؟
ممنون میشم کمک کنید .

nadia_1987
یک شنبه 10 مرداد 1389, 19:45 عصر
یعنی کسی نیست بتونه جواب سوال منو بده !!!!!
تنها امیدم به این فروم هست . دوباره نوشتم که up بشه .

vandermond
یک شنبه 10 مرداد 1389, 20:02 عصر
سلام دوست عزيز
الان حال نوشتن كوئري ندارم متاسفانه (نتايج كنكور ميخاد بياد آخه:افسرده:) ولي ميتوني توي رويداد SelectedChange (!) كمبو باكس اول بگي كه درسهايي كه ستون رشته اونها برابر با گزينه انتخابي كمبوباكس اول هستش رو توي كمبوباكس دوم نشون بده.
كوئري ش كاري نداره. كار با Where و ...
باز هم ببخشيد. اگه كسي كوئري نداد، آخرش خودم مينويسم از روي اجبار:چشمک:.

حجتی نیا
یک شنبه 10 مرداد 1389, 23:44 عصر
DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter("select dars-name from table where reshte=@reshte", sc);
da.SelectCommand.Parameters.AddWithValue("@reshte", comboBox1.Text);
da.Fill(ds, "dars");
comboBox1.DataSource = ds.Tables["dars"];
comboBox1.DisplayMember = "dars-name";
sc.Close();
در رویداد selectedIndexChanged بنویسش

nadia_1987
دوشنبه 11 مرداد 1389, 00:27 صبح
DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter("select dars-name from table where reshte=@reshte", sc);
da.SelectCommand.Parameters.AddWithValue("@reshte", comboBox1.Text);
da.Fill(ds, "dars");
comboBox1.DataSource = ds.Tables["dars"];
comboBox1.DisplayMember = "dars-name";
sc.Close();در رویداد selectedIndexChanged بنویسش

مرسی از جوابتون . اما چند تا مشکل دارم .
اول اینکه sc رو error میده و میگه معرفی نشده منم چون تا حالا اینجوری کد ننوشتم نمیدونم .
دوم اینکه جایی که نوشتید reshte=@reshte من چطوری میتونم item رو که از combobox اولی میگیرم اینجا بنویسم ؟؟؟
یعنی باید بنویسم ???@=majorid
ممنون میشم راهنمایی کنید .
اگه بخوام برای coombobox اولی query بنویسم راحت تر نیست ؟؟؟ بلد نیستما فقط پرسیدم .

vandermond
دوشنبه 11 مرداد 1389, 00:37 صبح
دوم اینکه جایی که نوشتید reshte=@reshte من چطوری میتونم item رو که از combobox اولی میگیرم اینجا بنویسم ؟؟؟
یعنی باید بنویسم ???@=majorid
ممنون میشم راهنمایی کنید .
اگه بخوام برای coombobox اولی query بنویسم راحت تر نیست ؟؟؟ بلد نیستما فقط پرسیدم .
ببين دوست عزيز
.....@ مهم نيست نقطه چين چي هستش مثل يك متغير هست كه شما تعريف ميكنيد. اسمش رو هر چي دوست داري بزار. فقط بايد توي:

da.SelectCommand.Parameters.AddWithValue("@......", comboBox1.Text);
هم نقطه چين همون متغير باشه. يعني در واقع توي كوئري ميگي كه مثلا where MajorID=@majorid اين يعني اينكه مقدار اگه مقدار MajorID برابر با پارامتر majorid بود. حالا مقدار پارامتر majorid رو هم با كد:

da.SelectCommand.Parameters.AddWithValue("@......", comboBox1.Text);
مشخص ميكني.
اميدوارم خوب توضيح داده باشم.

mmd2009
دوشنبه 11 مرداد 1389, 00:41 صبح
با سلام


جواب : اول اینکه sc رو error میده و میگه معرفی نشده منم چون تا حالا اینجوری کد ننوشتم نمیدونم .؟؟؟

sc چیزی هست که دوستمون نوشته که جوابش میشه مخفف کلمه SqlConnection



SqlConnection sc = new SqlConnection();
و البته موقعی اداپتر رو اینطوری می نویسن که کانکشن استرینگ برای اوله دی بی کانکشن تعریف شده باشه.


جواب : دوم اینکه جایی که نوشتید reshte=@reshte من چطوری میتونم item رو که از combobox اولی میگیرم اینجا بنویسم ؟؟؟
یعنی باید بنویسم ???@=majorid

همونطور که میبیند دوستمون اومدن با استفاده از پارامتر مقدار دهی کردن و البته شما میتونی این کارو نکنی ولی پیشنهاد من این که برای خواناتر شدن برنامه این کارو بکنی ( حداقل)

و واسه چیزی که نوشتید ???@=majorid نه اینطوری نمی نویسن

مثلا فرض کنید دو مقدار داریم

حالا اینطوری می نویسم



SqlDataAdapter da = new SqlDataAdapter("select dars-name from table where reshte=@reshte and majorid=@majorid", sc);
da.SelectCommand.Parameters.AddWithValue("@reshte", comboBox1.Text);
da.SelectCommand.Parameters.AddWithValue("@majorid", comboBox2.Text);


و راستی منظورتون مشخص نیست ایجا

اگه بخوام برای coombobox اولی query بنویسم راحت تر نیست ؟؟؟ بلد نیستما فقط پرسیدم .

nadia_1987
دوشنبه 11 مرداد 1389, 01:17 صبح
با سلام


جواب : اول اینکه sc رو error میده و میگه معرفی نشده منم چون تا حالا اینجوری کد ننوشتم نمیدونم .؟؟؟

sc چیزی هست که دوستمون نوشته که جوابش میشه مخفف کلمه SqlConnection



SqlConnection sc = new SqlConnection();
و البته موقعی اداپتر رو اینطوری می نویسن که کانکشن استرینگ برای اوله دی بی کانکشن تعریف شده باشه.


جواب : دوم اینکه جایی که نوشتید reshte=@reshte من چطوری میتونم item رو که از combobox اولی میگیرم اینجا بنویسم ؟؟؟
یعنی باید بنویسم ???@=majorid

همونطور که میبیند دوستمون اومدن با استفاده از پارامتر مقدار دهی کردن و البته شما میتونی این کارو نکنی ولی پیشنهاد من این که برای خواناتر شدن برنامه این کارو بکنی ( حداقل)

و واسه چیزی که نوشتید ???@=majorid نه اینطوری نمی نویسن

مثلا فرض کنید دو مقدار داریم

حالا اینطوری می نویسم



SqlDataAdapter da = new SqlDataAdapter("select dars-name from table where reshte=@reshte and majorid=@majorid", sc);
da.SelectCommand.Parameters.AddWithValue("@reshte", comboBox1.Text);
da.SelectCommand.Parameters.AddWithValue("@majorid", comboBox2.Text);

و راستی منظورتون مشخص نیست ایجا

اگه بخوام برای coombobox اولی query بنویسم راحت تر نیست ؟؟؟ بلد نیستما فقط پرسیدم .

من اصلا توی برنامه ام conectionstring معرقی نکردم و نمی خوام این کار رو بکنم . یعنی نباید این کار رو بکنم .
منظورم از query اینه که : وقتی یک combobox معرفی میکنیم میتونبیم با استفاده از dataset بدون نوشتن هیچ کدی یک سری داده از جدول به combobox بایند کنیم . از طرفی میتونیم برای این داده هایی که بایند میکنیم Add Query نیز استفاده کنیم.
مثل این عکس : http://img19.mediafire.com/2667753a71f9f2d5be4abb83ca0361986g.jpg

حجتی نیا
دوشنبه 11 مرداد 1389, 09:11 صبح
من اصلا توی برنامه ام conectionstring معرقی نکردم و نمی خوام این کار رو بکنم . یعنی نباید این کار رو بکنم .بدون کانکشن میخواین به دیتابیس وصل شین؟؟؟:متفکر:
اگه میخواین بدون کد اینکارو بکنین یعنی با بایند کردن، ابتدا داخل دیتاست و در tableadapter کوئری مورد نظر رو اضافه کنین(عکس 2) ، حالا به کمبو اون دیتاست رو بعنوان دیتاسورس معرفی کنین و datamember رو برابر فیلدی که میخواین نمایش داده بشه قرار بدین..
حالا در رویداد selectedindexchanged کمبو اولی، ابتدا دیتاست رو خالی و سپس اونو پرش کنین (عکس1)

nadia_1987
دوشنبه 11 مرداد 1389, 13:48 عصر
[quote=حجتی نیا;1054665]بدون کانکشن میخواین به دیتابیس وصل شین؟؟؟:متفکر:

ببنید برنامه ی من طوریه که یک clinet و server داره . کاربر باید اطلاعات رو از فرم کلاینت بگیره و به سرور بفرسته. بعد اطلاعات رو تفکیک کنه و توی دیتابیس ذخیره کنه . واسه همینه که میگم connection string نمیخوام. نپرسید چرا این همه می پیچونم چون استادم خواسته .

حالا از اینای که شما گفتید من چیزی سر در نیاوردم . ترو خدا پایین تر از دیپلم حرف بزنید .

ببینید وقتی با دیتا ست یک کمبو رو پر می کنید خودش به طور اتوماتیک این کد رو اضافه میکنه :
this.courseTableAdapter.Fill(this.projctDataSet3.C ourse

اما اینجا تمام Course ها رو نشون میده . من میخوام فقط اونهایی رو نشون بده که Major اونها با major که قبلا از کمبو اول انتخاب شده یکی باشه.

نمیدونم چطوری این کارو انجام بدم ؟

حجتی نیا
دوشنبه 11 مرداد 1389, 15:47 عصر
یه برنامه واستون میزارم نگاه کنین
http://www.4shared.com/file/2bAlIdJZ/_2__WindowsFormsApplication2.html
درضمن اینکه میگین بدون کانکشن میخوام انجام بدم، غیر ممکنه چون همینکه شما داره از این دیتاست داره استفاده میکنین ، یعنی داری از کانکشن استفاده میکنی (یه سری به پروپرتی دیتاست بزن، میبینی که یه کانکشن داره)
این بخش از برنامت که داری روش صحبت میکنیم مربوط به کلاینت هست یا سرور ؟؟

nadia_1987
سه شنبه 12 مرداد 1389, 14:52 عصر
یه برنامه واستون میزارم نگاه کنین
http://www.4shared.com/file/2bAlIdJZ/_2__WindowsFormsApplication2.html
درضمن اینکه میگین بدون کانکشن میخوام انجام بدم، غیر ممکنه چون همینکه شما داره از این دیتاست داره استفاده میکنین ، یعنی داری از کانکشن استفاده میکنی (یه سری به پروپرتی دیتاست بزن، میبینی که یه کانکشن داره)
این بخش از برنامت که داری روش صحبت میکنیم مربوط به کلاینت هست یا سرور ؟؟

مرسی واسه برنامه.منم میخوام برنامه ام همین کار رو انجام بده اما نه با این روش.
میدونم ، مسلمه که وقتی دارم بایند میکنم یعنی به دیتابیس دسترسی دارم پس کانکشن هم دارم اما نمیخوام کد بنویسم .
بدون کد نویسی امکان داره ؟

این قسمت مربوط به کلاینت هستش . جایی که کاربر یه سری داده وارد می کنه . توی ااین فسمت نه چیزی به دیتابیس اضافه و نه کم میکنم . فقط یه سری اطلاعات بایند میکنم که اونم ممکنه استادم گیر بده . یعنی ممکنه ازم بخواد اطلاعات رو از سرور با data table بگیرم بعد بیام توی کلاینت دونه دونه کمبو ها رو پر کنم.
یعنی کلاینت هیچ دسترسی به دیتایس نداشته باشه .

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

nadia_1987
پنج شنبه 14 مرداد 1389, 21:40 عصر
دوستان من شرمنده ام . اما هنوز جواب سوالم رو نگرفتم. خواهشا کمک کنید . خیلی نیاز دارم .
ممنون میشم .

حجتی نیا
جمعه 15 مرداد 1389, 09:27 صبح
تو دیتابیس جداول رشته و درس جدا هستند؟ (فیلدهای دوجدول رو بزارین)

nadia_1987
جمعه 15 مرداد 1389, 13:50 عصر
تو دیتابیس جداول رشته و درس جدا هستند؟ (فیلدهای دوجدول رو بزارین)

بله ، جدا هستند .


:Major
MajorId
MajorName
DeptID



Course
CourseID
CourseName
MajorId
و....

Sajjad.Aghapour
جمعه 15 مرداد 1389, 14:07 عصر
یک نکته بعد دوستان ادامه بدن:
@حجتی نیا:
دلیلتون برای Close کردن Connection در پست شماره 4 چیه؟

sc.Close();

حجتی نیا
جمعه 15 مرداد 1389, 14:53 عصر
دوستان من شرمنده ام . اما هنوز جواب سوالم رو نگرفتم. خواهشا کمک کنید . خیلی نیاز دارم .
ممنون میشم .
برنامه رو میزارم بدون کدنویسی اضافه ، اونچیزی که شما میخواین ...
دیتابیس رو تو پوشه debug بریزین، اینم لینکش :
http://www.4shared.com/file/2QB0i068/Desktop.html

حجتی نیا
جمعه 15 مرداد 1389, 14:54 عصر
یک نکته بعد دوستان ادامه بدن:
@حجتی نیا:
دلیلتون برای Close کردن Connection در پست شماره 4 چیه؟

sc.Close();

تا جاییکه سواد من میکشه جایی خوندم که متد fill خودش کانکشن رو باز اما بسته نمیکنه...

Sajjad.Aghapour
جمعه 15 مرداد 1389, 15:06 عصر
تا جاییکه سواد من میکشه جایی خوندم که متد fill خودش کانکشن رو باز اما بسته نمیکنه...

این متد خودش این فراخوانی را انجام میده...
http://msdn.microsoft.com/en-us/library/zxkb3c3d.aspx

nadia_1987
شنبه 16 مرداد 1389, 00:33 صبح
برنامه رو میزارم بدون کدنویسی اضافه ، اونچیزی که شما میخواین ...
دیتابیس رو تو پوشه debug بریزین، اینم لینکش :
http://www.4shared.com/file/2QB0i068/Desktop.html

مرسی . اما ایراد میگیره . میگه :
No overload for method Fill takes "2" argument
آخه کمبوباکس اول را هم اینجا بهش پاس دادید.

حجتی نیا
شنبه 16 مرداد 1389, 00:49 صبح
مرسی . اما ایراد میگیره . میگه :
No overload for method Fill takes "2" argument
آخه کمبوباکس اول را هم اینجا بهش پاس دادید.
برنامه ارور نمیده، جایی رو تغییر دادین؟؟
خط ارور رو بگین

nadia_1987
شنبه 16 مرداد 1389, 00:52 صبح
برنامه ارور نمیده، جایی رو تغییر دادین؟؟
خط ارور رو بگین


private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
this.table1TableAdapter.Fill(this.database1DataSet .Table1, comboBox1.Text);
}

راستی منظورتون از اینکه گفتید دیتابیس رو بذارم توی اون پوشه . کدوم دیتابیس رو می گفتید ؟

حجتی نیا
شنبه 16 مرداد 1389, 09:39 صبح
راستی منظورتون از اینکه گفتید دیتابیس رو بذارم توی اون پوشه . کدوم دیتابیس رو می گفتید ؟
خسته نباشید...
لینکی که دادم واسه دانلود دیتابیسش بود، محتویاتش رو تو پوشه debug بریزین

nadia_1987
یک شنبه 17 مرداد 1389, 01:02 صبح
خسته نباشید...
لینکی که دادم واسه دانلود دیتابیسش بود، محتویاتش رو تو پوشه debug بریزین

:خجالت:
مرسی . برنامه شما با دیتابیس که داده بودید عالی کار میکنه . اما من اگه بخوام با دیتابیس خودم نوی VS2008 بنویسم . مراحل کار را نمی دونم .
انجام دادم اما ایراد می گیره .

من اول دو تا کمبو باکس گذاشتم . برای اولی major رو بایند کردم و majorid رو گذاشتم Displaymember .
برای دومی هم به همین ترتیب اما برای Course .
بعد رفتم توی دیتا ست برای جدول دومی . کلیک راست کردم و یک Query جدید با نام FillBy به این صورت نوشتم :

SELECT majorid, cstitle FROM dbo.Course WHERE (majorid=@majorid)
که این اشکال رو گرفت ولی ساخته شد :
"The new command text returns data with schema different from the schema of the main query. Check your query's command text if this is not desired"

بعد هم این کد رو اضافه کردم :


private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
this.courseTableAdapter.FillBy(this.projctDataSet. Course, Convert.ToInt32(comboBox1.Text));
}کد لود فرم هم اینه . با کد شما فرق داره :

private void Form1_Load(object sender, EventArgs e)
{
// TODO: This line of code loads data into the 'projctDataSet.Major' table. You can move, or remove it, as needed.
this.majorTableAdapter.Fill(this.projctDataSet.Maj or);
// TODO: This line of code loads data into the 'projctDataSet.Course' table. You can move, or remove it, as needed.
this.courseTableAdapter.Fill(this.projctDataSet.Co urse);

}اشکال کارم کجاست . چوی توی RUN این error رو میده :

Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign-key constraints.

جایی که نوشتم :
this.courseTableAdapter.FillBy(this.projctDataSet. Course, Convert.ToInt32(comboBox1.Text));

شرمنده خیلی گیج بازی در می یارم اما چه کنم کسی جز اینجا نیست کمکم کنه .

حجتی نیا
یک شنبه 17 مرداد 1389, 10:14 صبح
بعد رفتم توی دیتا ست برای جدول دومی . کلیک راست کردم و یک Query جدید با نام FillBy به این صورت نوشتم :

کد:
SELECT majorid, cstitle FROM dbo.Course WHERE (majorid=@majorid)
که این اشکال رو گرفت ولی ساخته شد :
"The new command text returns data with schema different from the schema of the main query. Check your query's command text if this is not desired"

تو کوئری فقط 2تا قیلد رو انتخاب میکنی ولی احتمالا در اون جدول بیش از دو قیلد دارین در نتیجه، رکورهای بدست آوده از این کوئری نمیتونه تو اون دیتاست جایی داشته باشه .. واسه حلش تو کوئری همه فیلدارو انتخاب کنین (مشکلی نداره)

اشکال کارم کجاست . چوی توی RUN این error رو میده
اگه مشکل بالا حل شد،اینم حل میشه
درضمن لازم نیست در لود برنامه هر دو جدول رو پر کنین (اگه لازم ندارین)چون ممکنه باعث کند شدن برنامه بشه .. هروقت رو کمبو اولی کلیک کردین،دومی رو پر کنین

C Sharp
یک شنبه 17 مرداد 1389, 11:35 صبح
ضمن تایید حرفای "حجتی نیا" عزیز ، منم این توضیحات رو اضافه میکنم با اجازتون :

هر TableAdapter توی دیتاست یه کوئری اصلی داره که اگه دقت کنید فرقش با کوئری هایی که بعدا اضافه میکنید اینه که یه علامت تیک هم داره که بقیه کوئری های اون TableAdapter ندارن

این کوئری مشخص کننده شمای DataTable هست ، یعنی چه ستونهایی داشته باشه و نوع هر ستون چیه و ...
حالا بقیه کوئری هایی که بعدا اضافه میکنید باید از همین شما واسه پر کردن DataTable استفاده کنه

کاری که لازمه انجام بدین فقط اینه که وقتی ویزارد افزودن کوئری جدید ، بطور پیشفرض کوئری اصلی رو به شما نشون داد ، فقط تو خط آخرش شرط Where خودتون رو اضافه کنید و به ستونها و احتمالا join ها کار ی نداشته باشین

nadia_1987
یک شنبه 17 مرداد 1389, 13:27 عصر
اگه مشکل بالا حل شد،اینم حل میشه


مرسی . مشکل حل شد اما یه اتفاق خیلی عجیب . این کد را ببینید .

string major = Convert.ToString(comboBox1.SelectedValue);
int maj = Convert.ToInt32(major);
this.courseTableAdapter.Fill(this.projctDataSet8.C ourse,maj);

این کد کاv میکنه و درس هایی که رشته انها با maj یکسان است رو به من نشون میده ولی زمانی که فرم رو میبندم این Exception رو میده :

int maj = Convert.ToInt32(major);

Input String Was Not in correct format.

و مقدار ""=Major و 0=maj نشون میده اما کار میکنه.. چرا این اتفاق میفته ؟؟؟؟

من توی کمبو باکس اولی اسم رشته رو نشون میدم اما در value member آی دی اون رشته رو میگیرم . چون توی جدول درس ها آی دی رشته ها رو ذخیره می کنم .

C Sharp
یک شنبه 17 مرداد 1389, 13:35 عصر
مشکلی که میگید عجیبه ، از اول ماجرا نبودم که ببینم چکار کردین
ولی فعلا واسه تبدیل رشته به عدد از این کد استفاده کنین :



int maj= 0;
if(int.TryParse(major,out maj))
this.courseTableAdapter.Fill(this.projctDataSet8.C ourse,maj);

حجتی نیا
یک شنبه 17 مرداد 1389, 16:42 عصر
مرسی . مشکل حل شد اما یه اتفاق خیلی عجیب . این کد را ببینید .

string major = Convert.ToString(comboBox1.SelectedValue);
int maj = Convert.ToInt32(major);
this.courseTableAdapter.Fill(this.projctDataSet8.C ourse,maj);

این کد کاv میکنه و درس هایی که رشته انها با maj یکسان است رو به من نشون میده ولی زمانی که فرم رو میبندم این Exception رو میده :

int maj = Convert.ToInt32(major);

Input String Was Not in correct format.

و مقدار ""=Major و 0=maj نشون میده اما کار میکنه.. چرا این اتفاق میفته ؟؟؟؟

من توی کمبو باکس اولی اسم رشته رو نشون میدم اما در value member آی دی اون رشته رو میگیرم . چون توی جدول درس ها آی دی رشته ها رو ذخیره می کنم .
چرا لقمه رو دور سرتون میچرخونین ؟؟:متفکر::متفکر:
اولش selectvalue رو به رشته تبدیل و بعد به عدد تبدیل میکنین، یعنی چی؟؟
خود selectedvalue عدد هست و نیازی به اینکار نیست ...

nadia_1987
یک شنبه 17 مرداد 1389, 23:54 عصر
چرا لقمه رو دور سرتون میچرخونین ؟؟:متفکر::متفکر:
اولش selectvalue رو به رشته تبدیل و بعد به عدد تبدیل میکنین، یعنی چی؟؟
خود selectedvalue عدد هست و نیازی به اینکار نیست ...


نه . اینجوریا نیست .
وقتی می نویسم
string major = combobox1.selectedvalue

می گه :
can not implicity convert type object to string.

حالا یه چیز جالب. تا امروز صبح که این کد رو امتحان می کردم ایراد می گرفت اما الان کار کرد :
int major = convert.toint32(combobox1.selectedvalue

درست شد . خیلی خیلی خیلی ممنون . از شما و تمام دوستان که کمک کردند.