Bu makele için Bilgehan YILDIZ' a teşekkürler
Windows Applicationlarda sıkça görülen kullanımlardan biride Bir Gridde listelenen kayıtların üzerine çift tıklanınca başka bir form açılarak bu formda değişik işlemlerin yapılmasıdır
1-)En basit olarak formun içinden form açmak için kullanılan komut
Bir buttonun click eventinde KisiDetay bizim oluşturduğumuz başka bir formun adı
New anahtar sözcüğü ile yaratıp show komutu ile gösterilmesini sağlıyoruz.Ancak show komutu ile kisidetay formu açıkken bile ana formumuzda işlem yapabiliyoruz.Eğer böyle açtığımız ikinci form açık iken ana formda işlem yapılmasını istemiyor isek ShowDialog komutunu kullanmamız gerekiyor.
Kod:
KisiDetay frm2 = new KisiDetay();
frm2.Show();
//frm2.ShowDialog();
2-)Örneğin formun loadunda Kisi Tablomuzdaki tüm kayıtları dolduracak bir komut çalıssın .Ancak bir burda şunu istiyoruz datatable içinde Kişi Tablosunun primary key olan KisiID de bulunsun,çünkü diğer forma bu değeri göndererek işlem yapacağız ancak runtimedada bu alan son kullanıcıdan gizlensin.
dataGridView1.Columns["KisiID"].Visible = false;
bunun içinde gridviewimizin datasource atandıktan sonra hangi kolonu gizlemek istiyorsak yukarıdaki kod örneğindeki gibi o kolonu saklayabiliriz.Eğer design time de gride datasource bağlı ise bu işlemi gridin özelliklerinde koda gerek kalmadan yapabilirsiniz.
Kod:
string baglantiyolu = ConfigurationManager.ConnectionStrings["TelefonRehberiConnectionString"].ConnectionString;
SqlConnection conn = new SqlConnection(baglantiyolu);
DataTable dt = new DataTable();
string sorgu = "Select * from Kisi";
SqlDataAdapter adap = new SqlDataAdapter(sorgu, conn);
adap.Fill(dt);
dataGridView1.DataSource = dt;
dataGridView1.Columns["KisiID"].Visible = false;
3-)Şimdi gelelim ana senaryomuza,biz griddeki bir satıra çift tıkladığımızda o satırın idsini diğer bir forma göndererek detaylarını göstermek istiyoruz.
Bunun için öncelikle gridviewimizin propertylerinde şu değişiklikleri yapmamız gerekir
MultiSelectFalse böylece kullanıcı birden fazla satır seçemez
ReadOnlyTrue böylece bu senaryoya göre kullanıcı zaten gridde değişiklik yapmayacak
SelectionModeFullRowSelect böylece kullanıcı griddeki satırda nereye tıklarsa tıklasın bizim istediğimiz işlem yapılabilir.
4-)Açılacak yeni formumuzun ana formumuzdan gelen değeri almasını istiyoruz bunun için 2.formumuz constructorına(Türkçesi yapıcı metod olarak geçer) aşağıdaki gibi kodumuzu yazmamız lazım.KisiDetay constructoruna tanımlayacağımız parametreler diğer formlardan çağrılırken bizden istenecektir
Sınıfların biz tanımlanmasa bile yapıcı metodu(Constructor) bulunmaktadır. İşte bu metoda varsayılan metod(default constructor)denilmektedir.Yapıcı metodların özelliklerine gelince geriye değer döndürmez ve class(sınıf) ismiyle aynı isimde bulunurlar.
Kod:
public partial class KisiDetay : Form
{
int KisiID;
public KisiDetay(int _KisiID)
{
KisiID = _KisiID;
InitializeComponent();
}
}
5-)Daha sonra Gridimizin CellContentClick eventine aşağıdaki kodu yazmamız gerekiyor
Kod:
KisiDetay frm2 = new KisiDetay(Convert.ToInt32(dataGridView1.SelectedRows[0].Cells["KisiID"].Value.ToString()));
frm2.ShowDialog();
Bu kod ile gridin seçili satırının KisiID değerini alarak yeni açacağımız forma parametre olarak göndermiş oluyoruz
6-)Artık KisiDetay formumuza kodları yazarak işlemlerimizi yapabiliriz.
Örnek formun loadında kişinin bilgilerini textlere dolsun.Burada zaten diğer formdan ID yolladığımız için geriye tek değer dönecektir.
Kod:
string baglantiyolu = ConfigurationManager.ConnectionStrings["TelefonRehberiConnectionString"].ConnectionString;
SqlConnection conn = new SqlConnection(baglantiyolu);
DataTable dt = new DataTable();
string sorgu = "Select * from Kisi where KisiID=@KisiID";
SqlParameter param = new SqlParameter("@KisiID", KisiID);
SqlDataAdapter adap = new SqlDataAdapter(sorgu, conn);
adap.SelectCommand.Parameters.Add(param);
adap.Fill(dt);
txtName.Text = dt.Rows[0]["Ad"].ToString();
txtSoyad.Text = dt.Rows[0]["Soyad"].ToString();
txtTcKimlik.Text = dt.Rows[0]["TCKimlik"].ToString();
nudYas.Value = Convert.ToInt32(dt.Rows[0]["Yas"].ToString());
if (dt.Rows[0]["Cinsiyet"].ToString() == "True")
{
rdbBay.Checked = true ;
}
else
{
rdbBayan.Checked=true;
}
7-)Son olarak da bu formda güncelleye basıldığında bu kaydın değerlerini güncelleyelim
Kod:
bool Cinsiyet;
if (rdbBay.Checked)
Cinsiyet = true;
else
Cinsiyet = false;
string baglantiyolu = ConfigurationManager.ConnectionStrings["TelefonRehberiConnectionString"].ConnectionString;
SqlConnection conn = new SqlConnection(baglantiyolu);
string sorgukisiguncelle = "Update Kisi Set Ad=@Ad,Soyad=@Soyad,Cinsiyet=@Cinsiyet,Yas=@Yas,TcKimlik=@Tckimlik where KisiID=@KisiID";
SqlParameter[] paramlist = new SqlParameter[6];
paramlist[0] = new SqlParameter("@Ad", txtName.Text);
paramlist[1] = new SqlParameter("@Soyad", txtSoyad.Text);
paramlist[2] = new SqlParameter("@Cinsiyet", Cinsiyet);
paramlist[3] = new SqlParameter("@Yas", nudYas.Value);
paramlist[4] = new SqlParameter("@TcKimlik", txtTcKimlik.Text);
paramlist[5] = new SqlParameter("@KisiID", KisiID);
SqlCommand cmd = new SqlCommand(sorgukisiguncelle, conn);
cmd.Parameters.AddRange(paramlist);
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
8-)Tabi bu işlem başarılı olsa bi bu formu kapatıp alttaki forma tekrar geçtiğimizde grid ilk açıldığı haldeki değerlerinde kalacaktır.Bunun için en kolay yöntem bu forma bir yenile tuşu koyarak gridin değerlerini tekrar yüklemek olacaktır