PDA

View Full Version : بایند اطلاعات یک فیلد به چیزی جز datagridview



c_doost
شنبه 05 فروردین 1391, 22:45 عصر
سلام
من یک جدول دارم که سه فیلد دارد حالا چطوری میتونم اطلاعات یک فیلد را در تکست باکس یا کومبو سرچ کنم و به همان تکست باکس یا کومبو بایند کنم؟
مثلا میخوام دنبال واژه سینما در فیلد دیتابیس بگردم چه طوری میتونم وقتی کاربر کاراکتر س را در کومبو باکس وارد کرد تمام رکورد هایی که با س شروع میشود یا س در آن وجود دارد را به کومبو بایند کنم و وقتی کاربر کاراکتر دوم یعنی ی را وارد کرد رکوردهایی که در آن سی وجود دارد به کومبو بایند شود ؟

Ali0Boy
یک شنبه 06 فروردین 1391, 00:49 صبح
ببین برای اینکه مشکلت حل شود یک تصویر گذاشتم رو اون توضیح می دهم.
در تصویر اون دو قسمت که 1 و 2 نام گذاری شده: شما می توانید یک dataset ایجاد کنید و به بانک مورد نظر ارتباط برقرار کنی و بعد از تب datasource اون dataset رو باز کنی و همان طور که می بینی table مربوط به بانک من هست. اون رو نیز باز کن و هر کدام از فیلد ها رو که می خوای بکش بیانداز روی فرم(مثل قسمت 2)

روش دوم قسمت 3: textbox های هر شیئی که به اون مربوط می شود رو بیار روی فرم و بعد در ویژگی های اون قسمت dataBindings رو باز کن و قسمت text رو انتخاب کن حال از dataset بانک مورد نظرت، اون فیلد مورد نظر رو انتخاب کن.

هر دو روش یک کار رو انجام می دهند ولی راه اول ساده تر هست. تازه در راه اول می تونی یک datagridview به صورت تنظیم اتوماتیک بندازی روی صفحه، به تصویر دومی نگاه کن، اونجایی که قرمز کردم رو درگ کن و بنداز رو صفحه، کارت حل میشه.

موفق باشید

عکس شماره 1:
84635

عکس شماره 2:
84636

c_doost
یک شنبه 06 فروردین 1391, 09:20 صبح
دوست عزیز من از توضیحات شما چیز زیادی نفهمیدم اگر قطعه برنامه دارید بزارید

این کد را برای یک کومبو باکس نوشتم ولی موقعی که اجرا میشه به تعداد رکورد های موجود در دیتابیس System.Data.DataRowView نوشته میشه
برای اینکه مقدار فیلد موجود در دیتابیس نشان داده شود چیکار کنم ؟

کد :


da = new SqlDataAdapter("SELECT reshte_honari FROM tbl_grouphonari", con);
da.Fill(ds, "tbl_grouphonari");
bs.DataSource = ds.Tables["tbl_grouphonari"];

comboBox2.DataSource = bs;

c_doost
یک شنبه 06 فروردین 1391, 12:05 عصر
سلام



برای اینکه با زدن یه حرف پیشنهاد بده باید autocompletemode رو روی suggest و autocompletesource رو روی listitems بزارید.

با اینکار ، اطلاعات با زدن هر کلید از دیتا بیس خونده میشه؟


چطوری میتونم با انتخاب یک آیتم از کومبو یک فیلد دیگر ( این فیلد کلید اصلی نیست ) از دیتابیس را انتخاب کنم و عملیاتی روی آن انجام دهم ؟

c_doost
دوشنبه 07 فروردین 1391, 19:09 عصر
نه دیگه یک بار در فرم لود اطلاعات رو میریزید در کمبو باکس و دیگه نیاز نیست هر بار این کار رو بکنید


private void Form1_Load(object sender, EventArgs e)
{
da = new SqlDataAdapter("SELECT reshte_honari FROM tbl_grouphonari", con);
da.Fill(ds, "tbl_grouphonari");
comboBox2.DataSource = ds.Tables["tbl_grouphonari"];
comboBox1.DisplayMember = "نام ستونی که باید نشون داده بشه";
comboBox1.ValueMember = "آیدی متناظر در جدول";
}



برای استخراج اطلاعات مورد نیاز دیگتون SelectedIndexChanged کمبو میتونید براساس متن داخل کمبو اطلاعات دیگه رو سلکت کنید


try
{
com.CommandText = "select * from JP_TBL where name=N'" + comboBox1.Text + "'";
da = new SqlCeDataAdapter(com.CommandText, con);
da.Fill(dt);
dataGridView1.DataSource = dt;
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}


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




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

namespace project_hoharmandan
{
public partial class frm_takhasos_honari : DevComponents.DotNetBar.Office2007Form
{
SqlDataReader dr;
SqlDataAdapter da;
SqlConnection con;
SqlCommand cmd;
DataSet ds;
BindingSource bs;

public frm_takhasos_honari()
{
InitializeComponent();
da = new SqlDataAdapter();
con = new SqlConnection(@"Data Source=.;Initial Catalog=honarmand;Integrated Security=True;Pooling=False");
cmd = new SqlCommand();
ds = new DataSet();
bs = new BindingSource();
}
string code_reshte="";
private void frm_takhasos_honari_Load(object sender, EventArgs e)
{
if (con.State == ConnectionState.Closed)
{
con.Open();
}
da = new SqlDataAdapter("SELECT * FROM tbl_grouphonari", con);
da.Fill(ds, "tbl_grouphonari");
bs.DataSource = ds.Tables["tbl_grouphonari"];

cmb_reshtehonari.DataSource = ds.Tables["tbl_grouphonari"];
cmb_reshtehonari.DisplayMember = "reshte_honari";
cmb_reshtehonari.ValueMember = "code_reshte";
dr.Close();
con.Close();
}

private void buttonX1_Click(object sender, EventArgs e)
{
DataLayer.tbl_shenasetakhasosi.InsertRow(cmb_resht ehonari.Text,txt_takhasoshonari.Text,txt_shenase.T ext);
}

private void cmb_reshtehonari_SelectedIndexChanged(object sender, EventArgs e)
{
if (con.State == ConnectionState.Closed)
{
con.Open();
}
cmd = new SqlCommand("SELECT * FROM tbl_grouphonari where reshte_honari='" + cmb_reshtehonari.Text + "'", con);
dr = cmd.ExecuteReader();
while (dr.Read())
{
code_reshte = dr[2].ToString();
}
}
}
}


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

asadegha
سه شنبه 08 فروردین 1391, 04:18 صبح
دوستمون زحمت کشیدن کد رو قرار دادن.

خاصیت displaymember کمبو رو برابر او فیلدی قرار بده که میخوای نمایش بده.
خاصیت ValueMember کمبو رو برابر اون فیلدی قرار بده که میخوای مقدارش برگردونده بشه.

توضیح: یعنی مثلا DisplayMember رو برابر فیلد Name قرار میدی و ValueMember رو برابر ID. حالا در کمبو نام ها رو نشون میده و وقتی که یک نام رو توی کمبو انتخاب میکنی SelectedValue برابر مقدار ID اون اسم میشه. در این حالت بجای استفاده از رویداد SelectedIndexChange باید برای رویداد SelectedValueChange کد بنویسی.

cmb_reshtehonari.DisplayMember = "reshte_honari";
cmb_reshtehonari.ValueMember = "code_reshte";


خوب حالا یه مورد دیگه میمونه و اون اینکه موقع فرم لود یا هرجایی که خواستی کمبو نمایش داده بشه خاصیت DataSource کمبو رو باید مقدار دهی کنی. به این صورت که از دیتابیس select میکنی و نتیجه ی بازگشتی که یک جدول(DataTable) هست (یا جدولی از دیتاست DataSet.Tables[0]) رو منتسب میکنی به Datasource.

da = new SqlDataAdapter("SELECT * FROM tbl_grouphonari", con);
da.Fill(dt);
cmb_reshtehonari.DataSource = dt;



حالا بازم اگه سوالی هست در خدمتم.

c_doost
چهارشنبه 09 فروردین 1391, 09:42 صبح
تا اونجایی که من فهمیدم جدول tbl_grouphonari سه ستون داره : code_reshte ، reshte_honari و یه ستون دیگه که من اسمشو فرض میکنم column3 باشه.
وقتی شما در فرم لود همه جدول رو سلکت میکنید(SELECT * FROM tbl_grouphonari) پس ستون سوم رو هم دارید از پایگاه داده میخونید پس نیازی به دستور سلکت دیگه ای نیست.
میتونید کد زیر رو امتحان کنید:


namespace project_hoharmandan
{
public partial class frm_takhasos_honari : DevComponents.DotNetBar.Office2007Form
{
public frm_takhasos_honari()
{
InitializeComponent();
}

SqlDataAdapter da = new SqlDataAdapter();
SqlConnection con = new SqlConnection(@"Data Source=.;Initial Catalog=honarmand;Integrated Security=True;Pooling=False");
SqlCommand cmd = new SqlCommand();
DataTable dt = new DataTable();

string code_reshte = "";

private void frm_takhasos_honari_Load(object sender, EventArgs e)
{
if (con.State == ConnectionState.Closed)
{
con.Open();
}
da = new SqlDataAdapter("SELECT * FROM tbl_grouphonari", con);
da.Fill(dt);
cmb_reshtehonari.DataSource = dt;
cmb_reshtehonari.DisplayMember = "reshte_honari";
cmb_reshtehonari.ValueMember = "code_reshte";

if (con.State == ConnectionState == ConnectionState.Open)
{
con.Close();
}
}

private void buttonX1_Click(object sender, EventArgs e)
{
DataLayer.tbl_shenasetakhasosi.InsertRow(cmb_resht ehonari.Text,txt_takhasoshonari.Text,txt_shenase.T ext);
}

private void cmb_reshtehonari_SelectedIndexChanged(object sender, EventArgs e)
{
code_reshte = dt.Rows[cmb_reshtehonari.SelectedIndex]["column3"].ToString();
}
}
}


نتیجه رو بگو.



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

namespace project_hoharmandan
{
public partial class frm_takhasos_honari : DevComponents.DotNetBar.Office2007Form
{
SqlDataReader dr;
SqlDataAdapter da;
SqlConnection con;
SqlCommand cmd;
DataSet ds;
BindingSource bs;
DataTable dt;
public frm_takhasos_honari()
{
InitializeComponent();
da = new SqlDataAdapter();
con = new SqlConnection(@"Data Source=.;Initial Catalog=honarmand;Integrated Security=True;Pooling=False");
cmd = new SqlCommand();
ds = new DataSet();
bs = new BindingSource();
DataTable dt = new DataTable();
}

string code_reshte="";

private void frm_takhasos_honari_Load(object sender, EventArgs e)
{
if (con.State == ConnectionState.Closed)
{
con.Open();
}
da = new SqlDataAdapter("SELECT * FROM tbl_grouphonari", con);
da.Fill(dt);
cmb_reshtehonari.DataSource = dt;
cmb_reshtehonari.DisplayMember = "reshte_honari";
cmb_reshtehonari.ValueMember = "code_reshte";
if (con.State == ConnectionState.Open)
{
con.Close();
}

}

private void buttonX1_Click(object sender, EventArgs e)
{
DataLayer.tbl_shenasetakhasosi.InsertRow(cmb_resht ehonari.Text,txt_takhasoshonari.Text,txt_shenase.T ext);
}

private void cmb_reshtehonari_SelectedValueChanged(object sender, EventArgs e)
{
if (con.State == ConnectionState.Closed)
{
con.Open();
}
cmd = new SqlCommand("SELECT * FROM tbl_grouphonari where reshte_honari='" + cmb_reshtehonari.SelectedText + "'", con);
dr = cmd.ExecuteReader();
while (dr.Read())
{
code_reshte = dr["code_reshte"].ToString();
}
dr.Close();
labelX1.Text = code_reshte;

}


}
}

dorna20-30
چهارشنبه 09 فروردین 1391, 10:57 صبح
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DevComponents.DotNetBar;
using System.Data.SqlClient;

namespace project_hoharmandan
{
public partial class frm_takhasos_honari : DevComponents.DotNetBar.Office2007Form
{
SqlDataReader dr;
SqlDataAdapter da;
SqlConnection con;
SqlCommand cmd;
DataSet ds;
BindingSource bs;

public frm_takhasos_honari()
{
InitializeComponent();
da = new SqlDataAdapter();
con = new SqlConnection(@"Data Source=.;Initial Catalog=honarmand;Integrated Security=True;Pooling=False");
cmd = new SqlCommand();
ds = new DataSet();
bs = new BindingSource();
}
string code_reshte="";
private void frm_takhasos_honari_Load(object sender, EventArgs e)
{
if (con.State == ConnectionState.Closed)
{
con.Open();
}
da = new SqlDataAdapter("SELECT * FROM tbl_grouphonari", con);
da.Fill(ds, "tbl_grouphonari");
bs.DataSource = ds.Tables["tbl_grouphonari"];

cmb_reshtehonari.DataSource = ds.Tables["tbl_grouphonari"];
cmb_reshtehonari.DisplayMember = "reshte_honari";
cmb_reshtehonari.ValueMember = "code_reshte";
dr.Close();
con.Close();
}

private void buttonX1_Click(object sender, EventArgs e)
{
DataLayer.tbl_shenasetakhasosi.InsertRow(cmb_resht ehonari.Text,txt_takhasoshonari.Text,txt_shenase.T ext);
}

private void cmb_reshtehonari_SelectedIndexChanged(object sender, EventArgs e)
{
if (con.State == ConnectionState.Closed)
{
con.Open();
}
cmd = new SqlCommand("SELECT * FROM tbl_grouphonari where reshte_honari='" + cmb_reshtehonari.Text + "'", con);
dr = cmd.ExecuteReader();
while (dr.Read())
{
code_reshte = dr[2].ToString();
}
}
}
}


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

دوست عزیز به نظر من شما تو قسمت پایانی یه connection و data reader باز کردین اما هیچ کدومو نبستین.اینو هم امتحان کنید امیدوارم جواب بگیرین.

c_doost
چهارشنبه 09 فروردین 1391, 14:24 عصر
سلام

انجام دادم ارور زیر را داد
برای چی اینقده این مساله پیچیده شد ؟
نکنه من نتونستم منظورمو خوب برسانم؟

asadegha
چهارشنبه 09 فروردین 1391, 17:52 عصر
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DevComponents.DotNetBar;
using System.Data.SqlClient;

namespace project_hoharmandan
{
public partial class frm_takhasos_honari : DevComponents.DotNetBar.Office2007Form
{
SqlDataReader dr;
SqlDataAdapter da;
SqlConnection con;
SqlCommand cmd;
DataSet ds;
BindingSource bs;
DataTable dt;
public frm_takhasos_honari()
{
InitializeComponent();
da = new SqlDataAdapter();
con = new SqlConnection(@"Data Source=.;Initial Catalog=honarmand;Integrated Security=True;Pooling=False");
cmd = new SqlCommand();
ds = new DataSet();
bs = new BindingSource();
DataTable dt = new DataTable();
}

string code_reshte="";

private void frm_takhasos_honari_Load(object sender, EventArgs e)
{
if (con.State == ConnectionState.Closed)
{
con.Open();
}
da = new SqlDataAdapter("SELECT * FROM tbl_grouphonari", con);
da.Fill(dt);
cmb_reshtehonari.DataSource = dt;
cmb_reshtehonari.DisplayMember = "reshte_honari";
cmb_reshtehonari.ValueMember = "code_reshte";
if (con.State == ConnectionState.Open)
{
con.Close();
}

}

private void buttonX1_Click(object sender, EventArgs e)
{
DataLayer.tbl_shenasetakhasosi.InsertRow(cmb_resht ehonari.Text,txt_takhasoshonari.Text,txt_shenase.T ext);
}

private void cmb_reshtehonari_SelectedValueChanged(object sender, EventArgs e)
{
if (con.State == ConnectionState.Closed)
{
con.Open();
}
cmd = new SqlCommand("SELECT * FROM tbl_grouphonari where reshte_honari='" + cmb_reshtehonari.SelectedText + "'", con);
dr = cmd.ExecuteReader();
while (dr.Read())
{
code_reshte = dr["code_reshte"].ToString();
}
dr.Close();
labelX1.Text = code_reshte;

}


}
}


فقط اونی که رنگش قرمزه رو پاک کن درست میشه. یعنی توی این کدی که گذاشتی 2 تا dt داری. یکی سراسریه که new نشده. یکی محلیه و فقط در حوزه سازنده فرم کار می کنه. که اشتباهه و نباید باشه.
public frm_takhasos_honari()
{
InitializeComponent();
da = new SqlDataAdapter();
con = new SqlConnection(@"Data Source=.;Initial Catalog=honarmand;Integrated Security=True;Pooling=False");
cmd = new SqlCommand();
ds = new DataSet();
bs = new BindingSource();
DataTable dt = new DataTable();
}

c_doost
چهارشنبه 09 فروردین 1391, 19:23 عصر
فقط اونی که رنگش قرمزه رو پاک کن درست میشه. یعنی توی این کدی که گذاشتی 2 تا dt داری. یکی سراسریه که new نشده. یکی محلیه و فقط در حوزه سازنده فرم کار می کنه. که اشتباهه و نباید باشه.
public frm_takhasos_honari()
{
InitializeComponent();
da = new SqlDataAdapter();
con = new SqlConnection(@"Data Source=.;Initial Catalog=honarmand;Integrated Security=True;Pooling=False");
cmd = new SqlCommand();
ds = new DataSet();
bs = new BindingSource();
DataTable dt = new DataTable();
}

آقا این قرمزی که گفتید کجاستتتت؟؟؟؟؟؟؟
اگر منظورت این خطه
<span dir="ltr"> <b>DataTable </b>dt = new DataTable();</span>

که حذفش کردم بازم ارور میدههههههه

c_doost
چهارشنبه 09 فروردین 1391, 20:09 عصر
پروژه را گذاشتم ولی بانکس را هر کاری کردم نشددددد

فیلدهای دیتابیسم



ID int Unchecked
reshte_honari nvarchar(50) Checked
code_reshte nvarchar(50) Checked
Unchecked

ID int Unchecked کلید صلی :

که میتونین یک جدو بسازید و به اون مقدار بدید


با تشکر

Mahmoud.Afrad
پنج شنبه 10 فروردین 1391, 02:51 صبح
اشکال رو اصلاح کردم

84858

c_doost
پنج شنبه 10 فروردین 1391, 09:21 صبح
تشکر از اینکه مشکل منو حل کردید

الان میخوام وقتی فرم لود میشه اطلاعات از دیتابیس به کومبو ریخته بشه ولی هیچ کدوم از آیتم های کومبو انتخاب نباشه برای اینکار cmb_reshtehonari.SelectedIndex = -1; را قرار دادم ولی موقع اجرا یه پیغام میده و اجرا میشه


private void frm_takhasos_honari_Load(object sender, EventArgs e)
{


try
{
if (con.State == ConnectionState.Closed)
{
con.Open();
}
da = new SqlDataAdapter("SELECT * FROM tbl_grouphonari", con);
da.Fill(dt);
cmb_reshtehonari.DataSource = dt;
cmb_reshtehonari.DisplayMember = "reshte_honari";
cmb_reshtehonari.ValueMember = "code_reshte";

cmb_reshtehonari.SelectedIndex = -1;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
if (con.State == ConnectionState.Open)
{
con.Close();
}
}

}

چیکار باید بکنم تا پیغامه نیاد؟
با تشکر

Mahmoud.Afrad
پنج شنبه 10 فروردین 1391, 16:42 عصر
میتونید یک گزینه پیشفرض به کمبو اضافه کنید مثلا "انتخاب کنید"
کد رو به این صورت تغییر بدید


SqlDataAdapter da = new SqlDataAdapter();
SqlConnection con = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\honarmand.mdf;Integrated Security=True;");
SqlCommand cmd = new SqlCommand();
DataTable dt = new DataTable();
DataTable dt_final = new DataTable();

private void Form1_Load(object sender, EventArgs e)
{
try
{
if (con.State == ConnectionState.Closed)
{
con.Open();
}
da = new SqlDataAdapter("SELECT * FROM tbl_grouphonari", con);
da.Fill(dt);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
if (con.State == ConnectionState.Open)
{
con.Close();
}
}
//در اینجا یک دیتاتیبل دیگر را طوری مقدار میدهیم که اولین گزینه را دستی اضافه میکنیم
dt_final.Columns.Add("code_reshte");
dt_final.Columns.Add("reshte_honari");
dt_final.Rows.Add();
dt_final.Rows[0]["code_reshte"] = null;
dt_final.Rows[0]["reshte_honari"] = "انتخاب کنید";

for (int i = 0; i <= dt.Rows.Count - 1; i++)
{
dt_final.Rows.Add();
dt_final.Rows[i + 1]["code_reshte"] = dt.Rows[i]["code_reshte"];
dt_final.Rows[i + 1]["reshte_honari"] = dt.Rows[i]["reshte_honari"];
}
//حافظه دیتاتیبل اول را آزاد میکنیم
dt.Dispose();

cmb_reshtehonari.DataSource = dt_final;
cmb_reshtehonari.ValueMember = "code_reshte";
cmb_reshtehonari.DisplayMember = "reshte_honari";

}
//اگر میخواهید به طور پیش فرض انتخاب صورت نگیره باید از رویداد
//SelectionChangeCommitted
//استفاده کنید
private void cmb_reshtehonari_SelectionChangeCommitted(object sender, EventArgs e)
{
label4.Text = cmb_reshtehonari.SelectedValue.ToString();
}