C# programlamaya ilk başladığım dönemlerde karşılaştığım ve çözmek için epeyce uğraştığım bir konu bu. Bir form düşünün içerisinde sadece textbox lar yok. Combobox içeren bir formunuzda Binding Navigator kullanmak istiyorsunuz. Karşılaşacağınız en büyük sorun combobox a çektiğiniz verileri BindingSource nesnesi ile bağdaştırmak.
İşleyiş şu şekilde; BindingSource nesnesini tanımladınız ve textboxları doldurdunuz. Aynı zamanda combobox nesnesini de bağladınız. Buraya kadar her şey normal. Sorun şurda başlıyor. Benim böyle başlamıştı :)
Üyeler tablomuz var ve yetki adlı bir kolonumuz var. Burada yetkiler Admin, üye, editör olarak değil, bunlara karşılık gelen id ler şeklinde. Yani 1,2,3 gibi. Çünkü yetkileri de ayrı bir tablodan alıyoruz. Ve metin olarak değil id(integer) olarak aktarmak istiyoruz üyeler tablosuna. Böyle olunca BindingNavigator nesnesini ileri geri oynatınca combobox ta rakamlar geliyor. Ama biz istiyoruz ki yetkilerin adları gelsin. İşte bunun çok basit çözümü var. Ben yeni başladığım için çok zorlanmıştım. Şimdi kodlarımıza geçelim, konuyu daha rahat kavrayacaksınız.
Bağlantınızı var kabul ederek anlatıyorum.
public partial class frm_user : Form
{
//tanımlamaları static olarak bu bölümde yaparsanız tüm formda kullanırsınız
static MySqlDataAdapter dagrd = new MySqlDataAdapter("Select * from users ;", baglanti);
static DataSet dsgrd = new DataSet();
static DataTable dtgrd = new DataTable();
static BindingSource bs = new BindingSource();
public frm_user()
{
InitializeComponent();
}
private void frm_user_Load(object sender, EventArgs e)
{
baglanti.Open();
/* Combo box dolduruluyor*/
DataSet dscmb = new DataSet();
DataTable dt1 = new DataTable();
MySqlDataAdapter dacmb = new MySqlDataAdapter("select * from yetkiler;",baglanti);
dacmb.Fill(dt1);
dacmb.Fill(dscmb, "yetkiler");
cmb_yetki.ValueMember = "DERECE";
cmb_yetki.DisplayMember = "YETKI";
cmb_yetki.DataSource = dt1;
/*textbox lar doluyor---------------------------*/
dagrd.Fill(dtgrd);
//dataGrid1.DataSource = dtgrd;
bs.DataSource = dtgrd;
bN1.BindingSource = bs;
if (bs.Count > 0)
{
txt_ad.DataBindings.Add(new Binding("Text", bs, "AD", true));
txt_soyad.DataBindings.Add(new Binding("Text", bs, "SOYAD", true));
txt_user.DataBindings.Add(new Binding("Text", bs, "USER", true));
txt_pass.DataBindings.Add(new Binding("Text", bs, "PASS", true));
cmb_yetki.DataBindings.Add(new Binding("SelectedValue", bs, "YETKI",true));
/* işte yukarıdaki satır can alıcı nokta. Dikkat ederseniz Text olarak değil SelectedValue olarak tanımlı. İşte herşey burada çözülüyor. Bu sayede görünürde admin olurken kayıt alanına karşılığı gelen id no gidiyor.
*/
cmb_departman.DataBindings.Add(new Binding("SelectedValue", bs, "DEPARTMAN", true));
chk_aktif.DataBindings.Add(new Binding("CheckState", bs, "AKTIF", true));
GridView1.DataSource = bs; //benim formumda GridView1 de vardı sizde yoksa kullanmayın bu kodu
}
else
{
lbl_uyari.Text = "";
}
}
private void frm_user_FormClosing(object sender, FormClosingEventArgs e)
{
dtgrd.Clear();//form her açıldığında tekrar yüklemesin GridView1'e
baglanti.Close();
}
private void kaydet_Click(object sender, EventArgs e)
{
bs.EndEdit();
dagrd.Update(dtgrd);
MessageBox.Show("Kayıt güncellendi");
}
}
}
Evet kodlarımız da bu şekilde. C# kodluyorsanız zaten bu kodları biliyorsunuz. Ancak kod içinde belirttiğim gibi burada ki olay DataBindings formatının Text olarak değil SelectedValue olarak verilmesi. Aynı şekilde checkbox formatı da dikkat ettiyseniz "CheckState" olarak verilmiş.
İşte çözüm kodlarımız bu kadar kolay.
İlginize teşekkür ederim. Yeni sayfalarda görüşmek üzere.
İşleyiş şu şekilde; BindingSource nesnesini tanımladınız ve textboxları doldurdunuz. Aynı zamanda combobox nesnesini de bağladınız. Buraya kadar her şey normal. Sorun şurda başlıyor. Benim böyle başlamıştı :)
Bağlantınızı var kabul ederek anlatıyorum.
public partial class frm_user : Form
{
//tanımlamaları static olarak bu bölümde yaparsanız tüm formda kullanırsınız
static MySqlDataAdapter dagrd = new MySqlDataAdapter("Select * from users ;", baglanti);
static DataSet dsgrd = new DataSet();
static DataTable dtgrd = new DataTable();
static BindingSource bs = new BindingSource();
public frm_user()
{
InitializeComponent();
}
private void frm_user_Load(object sender, EventArgs e)
{
baglanti.Open();
/* Combo box dolduruluyor*/
DataSet dscmb = new DataSet();
DataTable dt1 = new DataTable();
MySqlDataAdapter dacmb = new MySqlDataAdapter("select * from yetkiler;",baglanti);
dacmb.Fill(dt1);
dacmb.Fill(dscmb, "yetkiler");
cmb_yetki.ValueMember = "DERECE";
cmb_yetki.DisplayMember = "YETKI";
cmb_yetki.DataSource = dt1;
/*textbox lar doluyor---------------------------*/
dagrd.Fill(dtgrd);
//dataGrid1.DataSource = dtgrd;
bs.DataSource = dtgrd;
bN1.BindingSource = bs;
if (bs.Count > 0)
{
txt_ad.DataBindings.Add(new Binding("Text", bs, "AD", true));
txt_soyad.DataBindings.Add(new Binding("Text", bs, "SOYAD", true));
txt_user.DataBindings.Add(new Binding("Text", bs, "USER", true));
txt_pass.DataBindings.Add(new Binding("Text", bs, "PASS", true));
cmb_yetki.DataBindings.Add(new Binding("SelectedValue", bs, "YETKI",true));
/* işte yukarıdaki satır can alıcı nokta. Dikkat ederseniz Text olarak değil SelectedValue olarak tanımlı. İşte herşey burada çözülüyor. Bu sayede görünürde admin olurken kayıt alanına karşılığı gelen id no gidiyor.
*/
cmb_departman.DataBindings.Add(new Binding("SelectedValue", bs, "DEPARTMAN", true));
chk_aktif.DataBindings.Add(new Binding("CheckState", bs, "AKTIF", true));
GridView1.DataSource = bs; //benim formumda GridView1 de vardı sizde yoksa kullanmayın bu kodu
}
else
{
lbl_uyari.Text = "";
}
}
private void frm_user_FormClosing(object sender, FormClosingEventArgs e)
{
dtgrd.Clear();//form her açıldığında tekrar yüklemesin GridView1'e
baglanti.Close();
}
private void kaydet_Click(object sender, EventArgs e)
{
bs.EndEdit();
dagrd.Update(dtgrd);
MessageBox.Show("Kayıt güncellendi");
}
}
}
Evet kodlarımız da bu şekilde. C# kodluyorsanız zaten bu kodları biliyorsunuz. Ancak kod içinde belirttiğim gibi burada ki olay DataBindings formatının Text olarak değil SelectedValue olarak verilmesi. Aynı şekilde checkbox formatı da dikkat ettiyseniz "CheckState" olarak verilmiş.
İşte çözüm kodlarımız bu kadar kolay.
İlginize teşekkür ederim. Yeni sayfalarda görüşmek üzere.

Yorumlar
Yorum Gönder