PDA

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



daniyaltjm
چهارشنبه 17 شهریور 1395, 14:32 عصر
سلام، من میخوام دو تا فیلد از بانک مثل ID و Name رو در کامبوباکس نمایش بدم ولی فقط نام نمایش داده بشه و ID متناظرش مخفی باشه و بشه توی کدای دیگه ازش استفاده کرد حالا بدونه بایند کردن کامبو چطوری باید کد بزنم؟

این کد رو نوشتم ولی وقتی می خوام آیدی متناظر با اسم در کمبو باکس رو در یک لیبل نمایش بدم درست کار نمیکنه و آخرین آیدی در بانک رو نشون میده!!

private void RadForm1_Load(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=acc;Integrated Security=True");
SqlCommand cm = new SqlCommand("select accName,accID from Tbl_acc", con);
con.Open();
SqlDataAdapter da = new SqlDataAdapter(cm);
DataTable dt = new DataTable();
da.Fill(dt);
for (int i = 0; i < dt.Rows.Count; i++)
{
comboBox1.DisplayMember = dt.Rows[i]["accName"].ToString();
comboBox1.ValueMember = dt.Rows[i]["accID"].ToString();
comboBox1.Items.Add(comboBox1.DisplayMember);
}

con.Close();

}

و

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{

label2.Text = comboBox1.ValueMember;
}

rahmatipoor
پنج شنبه 18 شهریور 1395, 10:16 صبح
اینطوری بنویسید :

private void RadForm1_Load(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=acc;Integrated Security=True");
SqlCommand cm = new SqlCommand("select accName,accID from Tbl_acc", con);
con.Open();
SqlDataAdapter da = new SqlDataAdapter(cm);
DataTable dt = new DataTable();
da.Fill(dt);



comboBox1.DataSource = dt;
comboBox1.DisplayMember = "accName";
comboBox1.ValueMember = "accID";



con.Close();

}





با این کد هم ID آیتم انتخاب شده رو بگیرید :

textBoxX1.Text = comboBox1.SelectedValue.ToString();

daniyaltjm
پنج شنبه 18 شهریور 1395, 21:11 عصر
سلام ، من با مشکل عجیبی رو برو شدم این کدا رو ببینید:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace Accounting
{
public partial class RadForm1 : Telerik.WinControls.UI.RadForm
{
int id;
public RadForm1()
{
InitializeComponent();
}

private void RadForm1_Load(object sender, EventArgs e)
{

SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=acc;Integrated Security=True");
SqlCommand cm = new SqlCommand("select accName,accID from Tbl_acc", con);
con.Open();
SqlDataAdapter da = new SqlDataAdapter(cm);
DataTable dt = new DataTable();
da.Fill(dt);
comboBox1.DataSource = dt;
comboBox1.DisplayMember = "accName";
comboBox1.ValueMember = "accID";
con.Close();
id = int.Parse(comboBox1.SelectedValue.ToString());

}

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (comboBox1.SelectedValue.ToString() != "System.Data.DataRowView")
id = int.Parse(comboBox1.SelectedValue.ToString());
SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=acc;Integrated Security=True");
SqlCommand cm = new SqlCommand();
cm.CommandText = "select accID,accName,accCode,accLevel,accDirectID from Tbl_acc where accID= '" + id + "' ";
cm.Connection = con;
con.Open();
SqlDataAdapter da = new SqlDataAdapter(cm);
DataTable dt = new DataTable();
da.Fill(dt);
radGridView1.DataSource = dt;
radGridView1.Columns[0].HeaderText = "شناسه";
radGridView1.Columns[1].HeaderText = "نام";
radGridView1.Columns[2].HeaderText = "کد";
radGridView1.Columns[3].HeaderText = "سطح";
radGridView1.Columns[4].HeaderText = "کد مستقیم";
con.Close();
}
}
}


حالا اینا رو ببینید:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace Accounting
{
public partial class RadForm1 : Telerik.WinControls.UI.RadForm
{
int id;
public RadForm1()
{
InitializeComponent();
}

private void RadForm1_Load(object sender, EventArgs e)
{

SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=acc;Integrated Security=True");
SqlCommand cm = new SqlCommand("select accName,accID from Tbl_acc", con);
con.Open();
SqlDataAdapter da = new SqlDataAdapter(cm);
DataTable dt = new DataTable();
da.Fill(dt);
comboBox1.DataSource = dt;
comboBox1.DisplayMember = "accName";
comboBox1.ValueMember = "accID";
con.Close();
id = int.Parse(comboBox1.SelectedValue.ToString());

}

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{

id = int.Parse(comboBox1.SelectedValue.ToString());
SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=acc;Integrated Security=True");
SqlCommand cm = new SqlCommand();
cm.CommandText = "select accID,accName,accCode,accLevel,accDirectID from Tbl_acc where accID= '" + id + "' ";
cm.Connection = con;
con.Open();
SqlDataAdapter da = new SqlDataAdapter(cm);
DataTable dt = new DataTable();
da.Fill(dt);
radGridView1.DataSource = dt;
radGridView1.Columns[0].HeaderText = "شناسه";
radGridView1.Columns[1].HeaderText = "نام";
radGridView1.Columns[2].HeaderText = "کد";
radGridView1.Columns[3].HeaderText = "سطح";
radGridView1.Columns[4].HeaderText = "کد مستقیم";
con.Close();
}
}
}

کدای اول کار میکنن ولی در مورد کدای دوم خطا میده!! برنامرو تریس کردم دیدم که موقع لود شدن مقدار کامبو باکس با اینکه سطر اول انتخاب شده ولی این مقدار است:

System.Data>DataRowView
در صورتی که باید مقدار ID رو از بانک بگیره برای همین مجبور شدم این شرط رو بزارم که درست کار کنه دوستان خواهشا کمک کنید ببینیم این مشکل برای چی پیش اومده !!!


if (comboBox1.SelectedValue.ToString() != "System.Data.DataRowView")

rahmatipoor
پنج شنبه 18 شهریور 1395, 23:36 عصر
شما کد زیر رو توی متد SelectedIndexChanged کومبو باکس نوشتید و این متد هم همزمان با لود فرم اجرا میشه که توی اون زمان قسمت اول کد تون هم میخواد اجرا بشه و کومبوباکس رو پر کنه.

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) {

id = int.Parse(comboBox1.SelectedValue.ToString());
SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=acc;Integrated Security=True");
SqlCommand cm = new SqlCommand();
cm.CommandText = "select accID,accName,accCode,accLevel,accDirectID from Tbl_acc where accID= '" + id + "' ";
cm.Connection = con;
con.Open();
SqlDataAdapter da = new SqlDataAdapter(cm);
DataTable dt = new DataTable();
da.Fill(dt);
radGridView1.DataSource = dt;
radGridView1.Columns[0].HeaderText = "شناسه";
radGridView1.Columns[1].HeaderText = "نام";
radGridView1.Columns[2].HeaderText = "کد";
radGridView1.Columns[3].HeaderText = "سطح";
radGridView1.Columns[4].HeaderText = "کد مستقیم";
con.Close();
}




به جای متد SelectedIndexChanged کدتون رو توی متد SelectedIndexChangedCommitted بنویسید و همچنین اون رو توی try Catch قرار بدید
یعنی اینطوری :


private void comboBox1_SelectedIndexChangedCommitted (object sender, EventArgs e) {

try{



id = int.Parse(comboBox1.SelectedValue.ToString());
SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=acc;Integrated Security=True");
SqlCommand cm = new SqlCommand();
cm.CommandText = "select accID,accName,accCode,accLevel,accDirectID from Tbl_acc where accID= '" + id + "' ";
cm.Connection = con;
con.Open();
SqlDataAdapter da = new SqlDataAdapter(cm);
DataTable dt = new DataTable();
da.Fill(dt);
radGridView1.DataSource = dt;
radGridView1.Columns[0].HeaderText = "شناسه";
radGridView1.Columns[1].HeaderText = "نام";
radGridView1.Columns[2].HeaderText = "کد";
radGridView1.Columns[3].HeaderText = "سطح";
radGridView1.Columns[4].HeaderText = "کد مستقیم";
con.Close();
}
catch{}


}

daniyaltjm
جمعه 19 شهریور 1395, 00:20 صبح
SelectedIndexChangedCommitted این متد یعنی زمانی که کاربر اندکس رو تغییر بده عمل میکنه؟ خوب این رشته"System.Data.DataRowView" رو چرا بر میگردونه اصلا از کجا این مقدار اومده؟

rahmatipoor
جمعه 19 شهریور 1395, 18:41 عصر
SelectedIndexChangedCommitted این متد یعنی زمانی که کاربر اندکس رو تغییر بده عمل میکنه؟ خوب این رشته"System.Data.DataRowView" رو چرا بر میگردونه اصلا از کجا این مقدار اومده؟

بله این متد پس از اینکه عملیات تغییر ایندکس به صورت کامل تمام شد اجرا میشه
ولی ظاهرا متد SelectedIndexChanged در حال تغییر ایندکس انجام میشه

البته من طبق تجربه گفتم چون مشکل شما رو داشتم