PDA

View Full Version : سوال: برگرداندن ID متناظر با آیتم ComboBox



hamid.kurd
پنج شنبه 19 تیر 1393, 01:06 صبح
با سلام
من مقداری رو از دیتابیس به این صورت بر می گردونم و بایستی کلید متناظر با اون رو به عنوان کلید خارجی داشته باشم.
البته مقدار ID (همون کلید خارجی در برنامه حذف نمی شه و Autonumber هستش). که اینجا به textbox اختصاص دادم .
به نظر خودم مشکلی نخواهد داشت.
نظر شما اساتید چیه؟

private void loadrahinar()
{
OleDbDataReader dr;
OleDbCommand cmm = new OleDbCommand("select * from t", con);
con.Open();
dr = cmm.ExecuteReader();
while (dr.Read())
{
cmb1.Items.Add(dr.GetValue(1).ToString());

}

con.Close();

}

private void cmb1_SelectedIndexChanged(object sender, EventArgs e)
{
textBoxX1.Text = (cmb1.SelectedIndex + 1).ToString();
}

abbas.oveissi
پنج شنبه 19 تیر 1393, 02:15 صبح
دوست عزیز اگر الان یدونه از رکورد هارو پاک بکنید و دوباره اضافه کنید دیگه ID هاتون بترتیب نیست تا از این روش استفاده کنید.درست میگم یا اینکه اصن اشتباه فهمیدم منظورتون رو؟

اگر درست میگم روش من اینه DisplayMember و ValueMember رو برای کومبوباکس تنظیم میکنم و دیتاسورسش رو برابر دیتاتیبل برگردونده شده از دیتابیس قرار میدم.بعد با استفاده از خاصیت SelectedValue به ID دسترسی دارم.

hamid.kurd
پنج شنبه 19 تیر 1393, 02:58 صبح
دوست عزیز اگر الان یدونه از رکورد هارو پاک بکنید و دوباره اضافه کنید دیگه ID هاتون بترتیب نیست تا از این روش استفاده کنید.درست میگم یا اینکه اصن اشتباه فهمیدم منظورتون رو؟

اگر درست میگم روش من اینه DisplayMember و ValueMember رو برای کومبوباکس تنظیم میکنم و دیتاسورسش رو برابر دیتاتیبل برگردونده شده از دیتابیس قرار میدم.بعد با استفاده از خاصیت SelectedValue به ID دسترسی دارم.

شما درست میفرمایید - البته همونطور که اشاره کردم حذف کردن ندارم.
زیاد با این روشی که شما می فرمایید ور رفتم اما جواب نگرفتم این هم کدم public DataSet Loadteach2()
{
dsteach2.Clear();
cmd2.CommandText = "select * from t";
cmd2.Connection = con;
dat2.SelectCommand = cmd2;
con.Open();
dat2.Fill(dsteach2, "t");
con.Close();
cmd2.Parameters.Clear();
return dsteach2;
}
public void iudteach2(OleDbCommand cmd)
{
cmd2.Connection = con;
con.Open();
dat2.SelectCommand = cmd2;
dsteach2.Clear();
cmd2.ExecuteNonQuery();
con.Close();
dat2.Update(dsteach2, "t");
Loadteach2();
cmd2.Dispose();
}

private void Refteach2()
{
try
{

Loadteach2();
cmb1.DataSource = dsteach2.Tables[0];
cmb1.DisplayMember = "tname";


}
catch (Exception ex)
{
MessageBox.Show("errpor ");
MessageBox.Show(ex.Message);
Application.Exit();
}

}

در واقع مقدار ValueMember رو نتونستم بگیرم.

Mahmoud.Afrad
پنج شنبه 19 تیر 1393, 03:17 صبح
بله اشکال داره. شما نمیتونی به جای id رکورد انتخابی که در دیتابیس ذخیره شده و مقدارش هر چیری میتونه باشه، اندیس آیتم کمبو رو ذخیره کنی. (نمیتونی تضمین کنی ID با اندیس عنصر انتخابی برابر باشه)

دو ستون رو نیاز داری یکی که نام هست و دیگری آیدی متناظر هر نام پس کوئری رو به صورت زیر بنویس تا از لود ستونهای غیرضروری جلوگیری بشه. select ID, tname from t
حالا بعد از خط 33 کدهای بالا کافیه ValueMember رو ست کنی:
cmb1.ValueMember = "ID";
حالا بعد از انتخاب آیتم از کمبوباکس کافیه SelectedValue رو به int (نوع ستون ID) تبدیل کنی و این همان ID متناظر نام انتخاب شده هست.


کد پست اول رو به این صورت بنویس:

private void loadrahinar()
{
OleDbCommand cmm = new OleDbCommand("select id , tname from t", con);
OleDbDataAdapter adapter = new OleDbDataAdapter(cmm);
DataTable dt = new DataTable();
adapter.Fill(dt);
cmb1.DataSource = dt;
cmb1.DisplayMember = "tname";
cmb1.ValueMember = "id";
}

private void cmb1_SelectedIndexChanged(object sender, EventArgs e)
{
textBoxX1.Text = cmb1.SelectedValue.ToString();
}