PDA

View Full Version : مشکل در دسترسی به Id آیتم انتخابی در کمبوباکس (ComboBox)



bili.koote
سه شنبه 28 شهریور 1391, 02:05 صبح
سلام.
من چند تا مشکل تو سی شارپ دارم.
1:
فرض کنید یه جدول تو دیتابیس دارم واسه رشته که دوتا فیلد "نام" از جنس nvarchar و یه کلید اصلی اتونامبر" آیدی" از جنس smallint داره.
یه جدول هم واسه استاد دارم که یه فیلد "نام استاد" داره از جنس nvarchar، یه فیلد "کد رشته" smallint.وقتی می خوام یه استاد جدید رو تو برنامه ثبت کنم،اول از کمبو باکس رشته رو انتخاب می کنم، می خوام "آیدی" مربوط به اون رشته و نامی که برای استاد وارد کردم توی جدول استاد ذخیره شه.اما بعضی وقت ها اشتباهی "آیدی" یه رشته ی دیگه رو ذخیره می کنه.نمیدونم چرا ؟؟؟
این کد ثبت استاد :
private void button2_Click(object sender, EventArgs e)
{
if (textBox2.Text != "")
{
SqlConnection con2 = new SqlConnection();
con2.ConnectionString = "data source=localhost;initial catalog=tamrin;integrated security=sspi;persist security info=true";
con2.Open();

SqlCommand com2 = new SqlCommand();
com2.CommandText = "insert into t_ostad (KodeReshte,name) values ('" + comboBox1.SelectedValue + "',N'" + textBox2.Text + "')";
com2.Connection = con2;
com2.ExecuteNonQuery();


con2.Close();

MessageBox.Show("ثبت استاد با موفقیت انجام شد");
comboBox1.Text = "Select";
textBox2.Text = "";
}
else
MessageBox.Show("نام استاد را وارد نمایید");
}


2:
می خوام دو تا کمبو باکس داشته باشم که یکیش کل رشته هارو نشون بده، بعد من هر رشته ای رو انتخاب کردم، کمبوباکس دوم فقط اسم استاد هایی که مربوط به اون رشته است نشون بده.کد این قسمت رو توی رویداد تغییر اندیس کمبوباکس اول نوشتم،اما نمیدونم چه جوری باید بنویسم که خطا نده.
وقتی میگم همه ی استاد هارو نشون بده مشکلی نداره ،اما where که میزارم این خطا رو میده :
Syntax error converting the nvarchar value 'System.Data.DataRowView' to a column of data type smallint

این هم کد دوتا کمبو باکس:
SqlConnection con4 = new SqlConnection();
con4.ConnectionString = "data source=localhost;initial catalog=tamrin;integrated security=sspi;persist security info=true";
con4.Open();
SqlDataAdapter sda4 = new SqlDataAdapter("select * from t_ostad where (KodeReshte=N'" + comboBox4.SelectedValue + "')", con4);
DataSet ds4 = new DataSet();
ds4.Tables.Add("t_ostad");
sda4.Fill(ds4, "t_ostad");
comboBox5.DataSource = ds4.Tables["t_ostad"];
comboBox5.DisplayMember = ds4.Tables["t_ostad"].Columns["name"].ToString();
con4.Close();

mehrdad1261
سه شنبه 28 شهریور 1391, 05:16 صبح
با سلام دوست عزیز
بهترین کار ممکن برای رفع مشکلاتت استفاده از break point هست . این جوری دقیقا می تونی بفهمی که چه رشته ای رو موقع اجرا دادی به sql تا برات اجرا کنه . مثلا :
string s="select * from t_ostad where (KodeReshte=N'" + comboBox4.SelectedValue + "')";
رو بگذار و بعد جلوی خط break point قرار بده و مقدار رو دقیق ببین . (برای گذاشتن break point باید کنار خط که کد رو نوشتی سمت چپ کلیک کنی و دایره قرمز رنگی ایجاد میشه و هر موقع که کامپایلر در حال اجرای اون باشه متوقف میشه و میتونی مقدار رو ببینی )
برای سوال اول فکر کنم باید این رو هم چک کنی که combo حتما یه مقداری داشته باشه :

if(comboBox1.SelectedIndex!=-1)

bili.koote
چهارشنبه 29 شهریور 1391, 06:20 صبح
با سلام دوست عزیز
بهترین کار ممکن برای رفع مشکلاتت استفاده از break point هست . این جوری دقیقا می تونی بفهمی که چه رشته ای رو موقع اجرا دادی به sql تا برات اجرا کنه . مثلا :
string s="select * from t_ostad where (KodeReshte=N'" + comboBox4.SelectedValue + "')";
رو بگذار و بعد جلوی خط break point قرار بده و مقدار رو دقیق ببین . (برای گذاشتن break point باید کنار خط که کد رو نوشتی سمت چپ کلیک کنی و دایره قرمز رنگی ایجاد میشه و هر موقع که کامپایلر در حال اجرای اون باشه متوقف میشه و میتونی مقدار رو ببینی )
برای سوال اول فکر کنم باید این رو هم چک کنی که combo حتما یه مقداری داشته باشه :

if(comboBox1.SelectedIndex!=-1)
================================================== ====
سلام
از وقتی که واسه جواب دادن گذاشتی ممنون.
در مورد سوال اولم که گفتم آیدی بعضی از رشته ها ، تو جدول استاد اشتباهی ثبت میشه فکر نکنم مشکل از اندیس باشه، چون من خودم برنامه رو تست میکردم هر دفعه یکی از آیتم های کمبوباکس رو انتخاب کرده بودم و مقدار خالی ارسال نمیشد به دیتابیس.
سوالی که الآن واسم پیش اومد اینه :کمبوباکس من از روی دیتابیسم پر میشه، و قبل از اینکه من چیزی رو انتخاب کنم اندیس صفرش همیشه انتخاب شده هست؛این کد چک کردن کمبوباکس، واسه اینجور وقت ها هم درست جواب میده ؟ شاید یه نفر یادش رفت مقدار اون کمبوباکس رو انتخاب کنه،راهی هست زورکی یه مقدار واسش ثبت نشه؟

در مورد breakpoint هم مقداری که میریزه تو متغیر اینه: "select * from t_ostad where (KodeReshte=N'System.Data.DataRowView')"

که من نمیدونم datarowview چیه :ناراحت: ولی با توجه با اینکه من تو فرم لود گفتم ValueMember این کمبوباکس "آیدی" ش باشه، انتظار داشتم دو تا عدد رو با هم مقایسه کنه،سطرهایی که مقدار عددها برابره "name" رو برگردونه.

mhdhp86
چهارشنبه 29 شهریور 1391, 14:12 عصر
من این کد رو دارم:

DataTable dt = new DataTable();
SqlDataAdapter ada = new SqlDataAdapter("select * from city",con );
ada.Fill(dt);
citycombo.DataSource = dt;
citycombo.DisplayMember = "cityname";
cityofuni.DataSource = dt;
cityofuni.DisplayMember = "cityname";

DataTable dt1 = new DataTable();
SqlDataAdapter ada1 = new SqlDataAdapter("select * from university",con);
ada1.Fill(dt1);
unicombo.DataSource = dt1;
unicombo.DisplayMember = "uniname";
unicombo1.DataSource = dt1;
unicombo1.DisplayMember = "uniname";


این دوتا کد مثل هم دیگه هست که قراره دو تا کومبوباکس رو پر کنه. اما فقط یکیش پر میشه!! چرا؟

SharpSabre
چهارشنبه 29 شهریور 1391, 14:35 عصر
تو Sql از ComboBox1.Text استفاده کن .
com2.CommandText = "insert into t_ostad (KodeReshte,name) values ('" + comboBox1.Text + "

mhdhp86
چهارشنبه 29 شهریور 1391, 17:12 عصر
این دوتا کد مثل هم دیگه هست که قراره دو تا کومبوباکس رو پر کنه. اما فقط یکیش پر میشه!! چرا؟

الان کشف کردم که تا الان اصلا هیچ وقت جدول مربوطه توش اطلاعاتی ثبت نمیشده که بخواد بیاد توی کومبوباکس! وقتی بررسی کردم متوجه شدم فیلد کلیدی که برای جدولش انتخاب کردم Is Identity اش No هست. چه طوری می تونم به Yes تغییرش بدم؟
(ببخشید میدونم سئوالم مربوط به بخش SQL هست.اما اونجا چند سال طول میکشه تا یکی به سئوالم جواب بده!)

roolinjax
چهارشنبه 29 شهریور 1391, 17:49 عصر
الان کشف کردم که تا الان اصلا هیچ وقت جدول مربوطه توش اطلاعاتی ثبت نمیشده که بخواد بیاد توی کومبوباکس! وقتی بررسی کردم متوجه شدم فیلد کلیدی که برای جدولش انتخاب کردم Is Identity اش No هست. چه طوری می تونم به Yes تغییرش بدم؟
(ببخشید میدونم سئوالم مربوط به بخش SQL هست.اما اونجا چند سال طول میکشه تا یکی به سئوالم جواب بده!)

با سلام
روی علامت + کنار IsIdentity کلیک کن تا باز بشه ، بعد مقدار داخل اون رو با انتخاب از کمبوباکس مربوطه به Yes تغییر بده.
ضمنا من متوجه نشدم آیا مشکل اصلی شما که به خاطرش تاپیک زدین حل شده یا نه ؟

mhdhp86
چهارشنبه 29 شهریور 1391, 19:19 عصر
با سلام
روی علامت + کنار IsIdentity کلیک کن تا باز بشه ، بعد مقدار داخل اون رو با انتخاب از کمبوباکس مربوطه به Yes تغییر بده.
ضمنا من متوجه نشدم آیا مشکل اصلی شما که به خاطرش تاپیک زدین حل شده یا نه ؟
سلام
خیلی ممنون. تاپیک رو من شروع نکردم!
مشکل من برای تغییر اینه که اصلا کومبو باکسی وجود نداره!خاموشه... شاید من اشتباها جای دیگه میرم. کجا باید این کار رو انجام بدم؟
93107

roolinjax
چهارشنبه 29 شهریور 1391, 19:59 عصر
مسلما نوع داده ای که انتخاب کردی بهت این اجازه رو نمیده
بهتره از نوع Decimal استفاده کنی

mhdhp86
چهارشنبه 29 شهریور 1391, 20:18 عصر
مسلما نوع داده ای که انتخاب کردی بهت این اجازه رو نمیده
بهتره از نوع Decimal استفاده کنی
اگر این جواب سئوال منه باید بگم نوع داده ام int هست. توی یک جدول دیگه int هست و مشکلی نداره

roolinjax
چهارشنبه 29 شهریور 1391, 20:28 عصر
اگر این جواب سئوال منه باید بگم نوع داده ام int هست. توی یک جدول دیگه int هست و مشکلی نداره

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

bili.koote
پنج شنبه 30 شهریور 1391, 00:13 صبح
تو Sql از ComboBox1.Text استفاده کن .
com2.CommandText = "insert into t_ostad (KodeReshte,name) values ('" + comboBox1.Text + "
================================================== ====
سلام
با این دستور اسم رشته درست ثبت میشه، اما من اسمش رو نمی خوام تو دیتابیس ذخیره کنم ، آیدی متناظر با اون رشته رو می خوام

bili.koote
پنج شنبه 30 شهریور 1391, 00:26 صبح
سلام
خیلی ممنون. تاپیک رو من شروع نکردم!
مشکل من برای تغییر اینه که اصلا کومبو باکسی وجود نداره!خاموشه... شاید من اشتباها جای دیگه میرم. کجا باید این کار رو انجام بدم؟
93107
================================================== ===========
سلام
واسه اینکه کلید اصلی دیتابیست اتو نامبر خودش عدد بگیره باید وارد محیط SQL Manager بشی .از پوشه ی دیتابیس ها دیتا بیس خودت رو پیدا کنی.بعد table ها رو پیدا کنی.از کادر سمت راست که اسم جدول ها رو لیست کرده روی جدولی که کلیدش قراره اتونامبر بشه کلیک راست کنی و Design رو انتخاب کنی.
فیلدهای جدول و نوع داده ای که براشون انتخاب کردی رو اینجا میتونی ببینی.روی فیلد کلید اصلیت کلیک کن، اگه جنس داده اش عددی باشه میتونی Identity رو براش yes کنی و بگی چندتا چندتا پیش بره :لبخندساده:

mhdhp86
پنج شنبه 30 شهریور 1391, 08:39 صبح
================================================== ===========
سلام
واسه اینکه کلید اصلی دیتابیست اتو نامبر خودش عدد بگیره باید وارد محیط SQL Manager بشی .:

دیتا بیسم به برنامه اتچ شده. با sql manager تغیر بدم تو برنامم اعمال میشه؟!!! :متفکر:

ali_habibi1384
پنج شنبه 30 شهریور 1391, 09:47 صبح
دیتا بیسم به برنامه اتچ شده. با sql manager تغیر بدم تو برنامم اعمال میشه؟!!! :متفکر:
اره مهم نيست با چي باشه.فقط بايد دسترسي داشته باشه واسه تغييرات

mhdhp86
پنج شنبه 30 شهریور 1391, 18:54 عصر
این combobox ها هر طرفش رو درست می کنم یه چیز دیگش خراب میشه!!:افسرده:

DataTable dt = new DataTable();
SqlDataAdapter ada = new SqlDataAdapter("select * from city",con );
ada.Fill(dt);
citycombo.DataSource = dt;
citycombo.DisplayMember = "cityname";
cityofuni.DataSource = dt;
cityofuni.DisplayMember = "cityname";


این دو تا کومبو باکس توی یک فرم هستند. با این کدها پرشون کردم. اما موقع اجرا وقتی یکیش رو یک گزینش رو انتخاب می کنم اون یکی هم همون انتخاب میشه!!!
یعنی مثلا اگر تو یکیش دومین گزینه رو انتخاب کنم خود به خود اون یکی هم دومین گزینش انتخاب میشه!!
چرا؟

mhdhp86
پنج شنبه 30 شهریور 1391, 22:07 عصر
نمی دونم من کلمات بدی برای جستجو انتخاب می کنم یا واقعا راجع به این موضوع تو اینترنت کسی چیزی نگفته. کسی نمی دونه این مشکل من از کجاست؟(پست بالایی)

bili.koote
جمعه 31 شهریور 1391, 07:10 صبح
این combobox ها هر طرفش رو درست می کنم یه چیز دیگش خراب میشه!!:افسرده:


این دو تا کومبو باکس توی یک فرم هستند. اما موقع اجرا وقتی یکیش رو یک گزینش رو انتخاب می کنم اون یکی هم همون انتخاب میشه!!!
یعنی مثلا اگر تو یکیش دومین گزینه رو انتخاب کنم خود به خود اون یکی هم دومین گزینش انتخاب میشه!!
چرا؟
================================================== =========
به جای اینکه برای پرکردن کمبو باکس ها از یه SqlDataAdapter استفاده کنی ،دو تا SqlDataAdapter تعریف کن که اسمشون یکی نباشه .(من واسه هر کدوم به جز دیتاآداپتر،یه دیتا ست جدا هم تعریف کردم )

mhdhp86
دوشنبه 03 مهر 1391, 13:31 عصر
================================================== =========
به جای اینکه برای پرکردن کمبو باکس ها از یه SqlDataAdapter استفاده کنی ،دو تا SqlDataAdapter تعریف کن که اسمشون یکی نباشه .(من واسه هر کدوم به جز دیتاآداپتر،یه دیتا ست جدا هم تعریف کردم )
سلام
ممنون از راهنماییت. اومده بودم بگم راه حل رو فهمیدم که دیدم شما جواب مشابه دادید.
من datatable ها رو جدا کردم درست شد. البته به طور منطقی هر چی فکر میکنم نباید به هم ربطی داشته باشند! چون اون در page load پر میشه اما این اتفاق بعد از تغییر در کومبو باکس رخ میده! به هر حال این طوری حل شد