PDA

View Full Version : کار با datasource



majidsoft
سه شنبه 03 شهریور 1388, 01:34 صبح
با سلام من در vb.net یک فرم دارم که یک کمبو باکس و چند تکست باکس دارد محتویات کمبو باکس را با استفاده از data source از دیتابیس می خوانم حالا می خواهم وقتی هرکدام از اعداد داخل کمبو باکس را انتخاب می کنم بقیه اطلاعات آن رکورد در (تکست باکسها) ی دیگر نمایش داده و یا ویرایش شود
باتشکر

k_m
سه شنبه 03 شهریور 1388, 13:47 عصر
2 تا راه داری
1- همه کنترل هات رو به یک DataSource می تونی bind کنی دیگه اینجوری هیچ کدی هم نیاز نیست بنویسی و خودش به صورت اتوماتیک انجام میشه.
2- مقدار combo انتخاب شده را در رویداد SelectedIndexChanged بگیری و بعد یک Select بزنی و اطلاعات مورد نیاز رو از DB بگیری و خودت نمایش بدی.

majidsoft
چهارشنبه 04 شهریور 1388, 00:17 صبح
دوست عزیز ضمن تشکر باید بگویم که در مورد راه اول تمام فیلدها را نشان می دهد من می خواهم با تغییر مقدار کامبو باکس مقدار تکست باکسها هم عوض شود

و در مورد راه دوم اگر یک query برام بنویس که بر اساس عدد کامبو باکس search کرده و اطلاعات مربوطه را بازگشت دهد ممنون می شم
با تشکر

Reza_Yarahmadi
چهارشنبه 04 شهریور 1388, 12:05 عصر
میشه به روش زیر هم عمل کرد. اینطوری دیگه نیازی نیست برای هر بار عوض شدن مقدار کمبو توی بانک جستجو کنید.
SqlDataAdapter da = new SqlDataAdapter("Select* from Table1", Conn);
DataSet ds = new DataSet();
da.Fill(ds, "t1");
comboBox1.DataSource = ds;
comboBox1.DisplayMember = "t1.Field1";
textBox1.DataBindings.Add("Text", ds, "t1.Field2");
textBox2.DataBindings.Add("Text", ds, "t1.Field3");
textBox3.DataBindings.Add("Text", ds, "t1.Field4");

majidsoft
پنج شنبه 05 شهریور 1388, 11:48 صبح
ضمن تشکر از توجه شما باید بگویم که من با vb.net کار می کنم ولی بعد از تبدیل نیز کامبو باکس را پر می کند ولی هنگام پرکردن تکست باکس ایراد datamember می گیرد

Dim da As New SqlDataAdapter("Select* from sugarinf", Fn_Get_SqlConnection())
Dim ds As DataSet = New DataSet()
da.Fill(ds, "sugarinf")
cmbdore.DataSource = ds.Tables("sugarinf")
cmbdore.DisplayMember = "dore"
txtbagase.DataBindings.Add("Text", ds, "bagase")

اگر لطف کنی روش دوم که در بالا گفتی یعنی عدد کمبو باکس را گرفته و با استفاده از query (لطف کن query که مقادیر را به برنامه برگرداند حتما برایم بنویس) مقادیر را به برنامه برگرداند توضیح بدی ممنون می شم
باتشکر

Reza_Yarahmadi
پنج شنبه 05 شهریور 1388, 16:46 عصر
کدهای زیر رو به جای کدهای خودت استفاده کن ببین درست میشه یا نه!
da.Fill(ds, "sugarinf")
cmbdore.DataSource = ds
cmbdore.DisplayMember = "sugarinf.dore"
txtbagase.DataBindings.Add("Text", ds, "sugarinf.bagase")
واسه روش دوم هم میتونی بصورت زیر عمل کنی:
Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
Dim conn As System.Data.SqlClient.SqlConnection
conn = New System.Data.SqlClient.SqlConnection("Data Source=.;Initial Catalog=Temp;Integrated Security=True")
Dim cmd As System.Data.SqlClient.SqlCommand
cmd = New System.Data.SqlClient.SqlCommand("Select * from Table1 where Field1 like @Field1", conn)
cmd.Parameters.AddWithValue("@Field1", ComboBox1.Text)
Dim dr As System.Data.SqlClient.SqlDataReader
conn.Open()
dr = cmd.ExecuteReader()
If (dr.Read()) Then
TextBox1.Text = dr("Field2").ToString()
TextBox2.Text = dr("Field3").ToString()
End If
End Sub

ولی بدی این روش اینه که اگه دو مقدار مشابه داخل کمبو باشه برای هر کدوم فقط داده های اولی رو نشون میده!!!

majidsoft
پنج شنبه 05 شهریور 1388, 18:21 عصر
با تشکر از توجه شما دوست گرامی کد اول شما اینگونه که در پایین نوشتم درست می شه




mp = Val(cmbrooz.Text)
ma = Val(cmbdore.Text)
Dim da As SqlDataAdapter = New SqlDataAdapter("SELECT * from sugarinf Where (sugarinf.dore = " & mp & ") " And " where (sugarinf.rooz=" & ma & ")", Fn_Get_SqlConnection())
Dim ds As DataSet = New DataSet
da.Fill(ds, "sugarinf")
txttonaj.DataBindings.Add("text", ds.Tables("sugarinf"), "tonaj")
txttonaj.DataBindings.Clear()



ولی در مورد روش دوم من یک کامبو روز و یک کامبو دوره دارم و چندتا تکست باکس که به عنوان مثال یکی از تکست باکسها را در بالا آورده ام
ببین دوست عزیز من چند کامبو دوره تکراری در دیتا بیس دارم ولی کامبو روز و دوره با هم تکراری نمیباشد من می خواهم با تغییر کامبو روز این کد بالا را انجام دهم ولی ایراد می گیرد
لطف کن یک نگاهی بهش بنداز با تشکر

Reza_Yarahmadi
جمعه 06 شهریور 1388, 11:44 صبح
کد اول زمانی استفاده داره که کلید یک فیلد باشه. برای کار که شما میخواید ، بهتره بصورت دستی پیاده سازی بشه.
توی روی Load فرم دستورات پر کردن کمبو دوره رو بنویسید.
private void Form1_Load(object sender, EventArgs e)
{
SqlCommand Cmd = new SqlCommand("Select Distinct dore from sugarinf", Conn);
SqlDataReader dr;
Conn.Open();
dr = Cmd.ExecuteReader();
while (dr.Read())
{
comboBox1.Items.Add(dr["Dore"]);
}
Conn.Close();
}
توی رویداد SelectedIndexChanged مربوط به کمبو دوره ، دستورات پر کردن کمبو روز (با توجه به مقدار کمبو دوره!!) رو بنویسید.
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
SqlCommand Cmd = new SqlCommand("Select rooz from sugarinf where dore like @Dore", Conn);
Cmd.Parameters.AddWithValue("@Dore", comboBox1.Text);
SqlDataReader dr;
Conn.Open();
dr = Cmd.ExecuteReader();
comboBox2.Items.Clear();
while (dr.Read())
{
comboBox2.Items.Add(dr["Rooz"]);
}
Conn.Close();
}
توی رویداد SelectedIndexChanged کمبو روز هم با توجه به مقدار 2 کمبو تکست باکسها رو پر کنید.
private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
{
SqlCommand Cmd = new SqlCommand("Select * from sugarinf where (dore like @Dore) and (rooz like @Rooz", Conn);
Cmd.Parameters.AddWithValue("@Dore", comboBox1.Text);
Cmd.Parameters.AddWithValue("@Rooz", comboBox2.Text);
SqlDataReader dr;
Conn.Open();
dr = Cmd.ExecuteReader();
if (dr.Read())
{
textBox1.Text = dr["Tonaj"].ToString();
textBox2.Text = dr["Name"].ToString();
textBox3.Text = dr["Kind"].ToString();
}
Conn.Close();
}
(خودتون زحمت تبدیلش به VB رو انجام بدید!)

majidsoft
جمعه 06 شهریور 1388, 23:06 عصر
با تشکر از شما دوست گرامی

saadi2
شنبه 07 شهریور 1388, 00:48 صبح
Dim Bs As BindingSource
Da = New SqlClient.SqlDataAdapter("select * from ostan", Con)
Da.Fill(Ds, "ostan")
Bs = New BindingSource(Ds, "ostan")
With ComboBox1
.DataSource = Bs
.DisplayMember = "ostanname"
.valuemember = "idostan"
End With
TextBox1.DataBindings.Add("text", Bs, "idostan")