none
Datagridview deki CurrentRow Değerini Değiştirmek icin Ne Yapmalı? RRS feed

  • Soru

  • Öncelikle yaptığım şeyden bahsedeyim;

    Bir Datagridview'im var ve SQL'den, DataTable oluşturarak tablomu görüntületiyorum. Datagridview'in CellMouseClick olayından da, e.Rowindex'i mousedeger adlı değişkene aktarıyorum. DataGridViewEditingControlShowingEventArgs ile Datagridview içindeyken, klavye tuşlarından Keys.Up ve Keys.Down ile yaptığım tuşlamalarda, mousedeger'in değişmesini sağlayarak, mousedeger'e ait row içeriğini Form2 üzerinde görüntületiyorum.

    Daha sonra Datagrid tablomun yanına, iki tane picturebox ekledim; tablo içinde bir evvelki ve bir sonraki satırları seçtirmek maksadıyla.. Click olaylarında da, mousedeger değişkenimi güncelleterek tablo içinde seçimimi yaptırdım. Ardından, görüntülemek istediğimi de yine Form2'de görüntüleyebildim.

    Şimdi, bu yaptıklarım ve klavye ileri geri hareketlerim gayet düzgün bir şekilde istediklerimi yerine getirdi. Fakat, bu Datagridview tablosunun içerisinde klavyeyle aşağıya inerken veya tam tersini yaparken oluşturmuş olduğum picturebox'lara tıkladığımda, mousedeger'i güncellettirip seçime devam edebiliyorken, picturebox'a basmayı bırakıp, tekrardan klavyenin yukarı, aşağı butonlarına bastığım zaman, picturebox ile 5. elemana gelsem bile, en son kaldığı yer 2. elemandı diyelim, bu satırdan öncekini veya sonrakini seçtirebiliyorum.

    Bir takım denemeler sonucunda da, picturebox'lara tıkladığımda datagridview.currentrow.index değerinin değişmediğini anladım. Ne yaptıysam da bir türlü değiştirtemedim. Yani, mousedeger ile aynı tablo içinde farklı satır seçtirdiğimde, currentrow.index değerinin, normal şartlarda değişmesi lazımken, mousedeger'inden bağımsız hareket etmesini bir türlü çözemedim.

    Net'te araştırırken, satır silip eklemeli bir çözüm vardı fakat, sql'den çektiğim datatable'ı datagridview üzerinde gösterttiğimden dolayı hata verdi. Zaten bu olay daha çok satır taşırken yapılıyor sanırım. Belki, insert into ile komut yazarak yaparım da anlamsız böyle bir iş için.. Alt tarafı seçim yaptıracağım o kadar..

    Bunun yanı sıra, datatable'ı Clear'layıp, datagrid'i yeniden doldurup istediğimi seçtirebilirim fakat, gene, böyle önemsiz bir şey için, lüzumsuz bir işlem yaptırmış olurum diye düşündüğümden bunu da geçiyorum.

    Biliyorum gereksiz bir şeymiş gibi gelebilir ama bunun basit bir çözümü var mı merak ediyorum. Kod filan istemeyin lütfen.. Bu currentrow'un değişmemesinin nedenini, değişebilir ise nasıl olduğunu merak ediyorum sadece..

    Bir de, açılışta oluşturmuş olduğum datatable üzerinde çalışıyorum. Yeni bir örnek almadan, aynı tablo üzerinde istediğimi gerçekleştirmeye çalışıyorum, bunu da belirteyim..


    20 Nisan 2019 Cumartesi 19:59

Yanıtlar

  • Kod istemeyelim tamam da o zaman problemin anlasilmiyor, netde bulduğun cozum garipmis :)

    void Main()
    {
    	DataTable tbl = new DataTable();
    	using (SqlConnection con = new SqlConnection(@"server=.\SQLExpress;Database=Northwind;Trusted_connection=yes;"))
    	using (SqlCommand cmd = new SqlCommand(@"select * from Customers", con))
    	{
    		con.Open();
    		tbl.Load(cmd.ExecuteReader());
    		con.Close();
    	}
    
    	Form f = new Form {Height=600,Width=800};
    	DataGridView dgv = new DataGridView { Height = 450, Width = 800, DataSource=tbl};
    	Button up = new Button { Top = 500, Width = 100, Text = "Onceki" };
    	Button down = new Button { Top = 500, Width = 100, Text = "Sonraki", Left = 140 };
    	f.Controls.AddRange(new Control[] {up,down,dgv});
    
    	f.Load += (sender, e) =>
    	{
    		EnableUpDown(up, down, dgv);
    	};
    
    	up.Click += (sender, e) => {
    		ChangeRow(dgv, -1);
    		EnableUpDown(up, down, dgv);
    	};
    	down.Click += (sender, e) => {
    		ChangeRow(dgv, 1);
    		EnableUpDown(up, down, dgv);
    	};
    	f.Show();
    }
    
    void EnableUpDown(Button up, Button down, DataGridView dgv)
    {
    	up.Enabled = dgv.CurrentCell.RowIndex > 0;
    	down.Enabled = dgv.CurrentCell.RowIndex < dgv.Rows.Count - 1;
    }
    
    void ChangeRow(DataGridView dgv, int v)
    {
    	if ((v == 1  && dgv.CurrentCell.RowIndex < dgv.Rows.Count-1) ||
    	    (v == -1 && dgv.CurrentCell.RowIndex > 0))
    	{
    		dgv.CurrentCell = dgv[0, dgv.CurrentCell.RowIndex + v];
    	}
    }


    21 Nisan 2019 Pazar 15:02
    Yanıtlayıcı

Tüm Yanıtlar

  • Kod istemeyelim tamam da o zaman problemin anlasilmiyor, netde bulduğun cozum garipmis :)

    void Main()
    {
    	DataTable tbl = new DataTable();
    	using (SqlConnection con = new SqlConnection(@"server=.\SQLExpress;Database=Northwind;Trusted_connection=yes;"))
    	using (SqlCommand cmd = new SqlCommand(@"select * from Customers", con))
    	{
    		con.Open();
    		tbl.Load(cmd.ExecuteReader());
    		con.Close();
    	}
    
    	Form f = new Form {Height=600,Width=800};
    	DataGridView dgv = new DataGridView { Height = 450, Width = 800, DataSource=tbl};
    	Button up = new Button { Top = 500, Width = 100, Text = "Onceki" };
    	Button down = new Button { Top = 500, Width = 100, Text = "Sonraki", Left = 140 };
    	f.Controls.AddRange(new Control[] {up,down,dgv});
    
    	f.Load += (sender, e) =>
    	{
    		EnableUpDown(up, down, dgv);
    	};
    
    	up.Click += (sender, e) => {
    		ChangeRow(dgv, -1);
    		EnableUpDown(up, down, dgv);
    	};
    	down.Click += (sender, e) => {
    		ChangeRow(dgv, 1);
    		EnableUpDown(up, down, dgv);
    	};
    	f.Show();
    }
    
    void EnableUpDown(Button up, Button down, DataGridView dgv)
    {
    	up.Enabled = dgv.CurrentCell.RowIndex > 0;
    	down.Enabled = dgv.CurrentCell.RowIndex < dgv.Rows.Count - 1;
    }
    
    void ChangeRow(DataGridView dgv, int v)
    {
    	if ((v == 1  && dgv.CurrentCell.RowIndex < dgv.Rows.Count-1) ||
    	    (v == -1 && dgv.CurrentCell.RowIndex > 0))
    	{
    		dgv.CurrentCell = dgv[0, dgv.CurrentCell.RowIndex + v];
    	}
    }


    21 Nisan 2019 Pazar 15:02
    Yanıtlayıcı
  • Kod istemeyelim tamam da o zaman problemin anlasilmiyor, netde bulduğun cozum garipmis :)

    void Main()
    {
    	DataTable tbl = new DataTable();
    	using (SqlConnection con = new SqlConnection(@"server=.\SQLExpress;Database=Northwind;Trusted_connection=yes;"))
    	using (SqlCommand cmd = new SqlCommand(@"select * from Customers", con))
    	{
    		con.Open();
    		tbl.Load(cmd.ExecuteReader());
    		con.Close();
    	}
    
    	Form f = new Form {Height=600,Width=800};
    	DataGridView dgv = new DataGridView { Height = 450, Width = 800, DataSource=tbl};
    	Button up = new Button { Top = 500, Width = 100, Text = "Onceki" };
    	Button down = new Button { Top = 500, Width = 100, Text = "Sonraki", Left = 140 };
    	f.Controls.AddRange(new Control[] {up,down,dgv});
    
    	f.Load += (sender, e) =>
    	{
    		EnableUpDown(up, down, dgv);
    	};
    
    	up.Click += (sender, e) => {
    		ChangeRow(dgv, -1);
    		EnableUpDown(up, down, dgv);
    	};
    	down.Click += (sender, e) => {
    		ChangeRow(dgv, 1);
    		EnableUpDown(up, down, dgv);
    	};
    	f.Show();
    }
    
    void EnableUpDown(Button up, Button down, DataGridView dgv)
    {
    	up.Enabled = dgv.CurrentCell.RowIndex > 0;
    	down.Enabled = dgv.CurrentCell.RowIndex < dgv.Rows.Count - 1;
    }
    
    void ChangeRow(DataGridView dgv, int v)
    {
    	if ((v == 1  && dgv.CurrentCell.RowIndex < dgv.Rows.Count-1) ||
    	    (v == -1 && dgv.CurrentCell.RowIndex > 0))
    	{
    		dgv.CurrentCell = dgv[0, dgv.CurrentCell.RowIndex + v];
    	}
    }


    Daha demin uygulamasını yapma şansım oldu..

    Aradığım şey, yazmış olduğunuz son satırdı. Onu da picturebox mouseclick'in scope'una 
        
    şu şekilde uyarlayarak yazdım oldu;

    this.dataGridView1.CurrentCell = this.dataGridView1[1,mousedeger]

    Ayrıca, rowheader'ın görünürlüğünü kapattığım için midir bilemiyorum, kolon satırı 

    1 yerine 0 olduğunda "geçerli hücre görünmez bir hücreye ayarlanamaz" diye hata verdi.

    Aynı sorunu yaşayacak olanlara şimdiden belirteyim.

    Kusura bakmayın, yeni cevap verebilme şansım oldu.. Teşekkürler yardımınız için..


    22 Nisan 2019 Pazartesi 19:18