muratboy31 Posted June 5, 2015 Share Posted June 5, 2015 (edited) Merhaba arkadaşlar, devexpress datagrid de gridView1_CustomColumnDisplayText özelliğini kullandığımda grid çok ağır çalışaya başlıyor hatta yeni satır ekleyemiyorum, neden olabilir acaba ? Satır ekleme için kullandığım button_click kodu ; (gridControl1.MainView as DevExpress.XtraGrid.Views.Grid.GridView).AddNewRow(); Edited June 5, 2015 by muratboy31 Quote Link to comment Share on other sites More sharing options...
KintaRo Posted June 5, 2015 Share Posted June 5, 2015 Tam anlamadım ama AddNewRow() boş satır ekler, ama senin kodların hücrelerden veri çektiği ve boş geldiği için hata veriyor. Dolu satırlar eklersen olacaktır. Kodlar: [spoiler] using DevExpress.XtraGrid.Columns; using DevExpress.XtraGrid.Views.Base; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Globalization; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApplication11 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private static GridColumn colSet(string text) { GridColumn col = new GridColumn(); Random rnd = new Random(); col.Name = rnd.Next(0, 500).ToString(); col.Caption = text; col.FieldName = text; return col; } private void Form1_Load(object sender, EventArgs e) { DataTable data = new DataTable(); data.Columns.Add("Onaylanan"); data.Columns.Add("Gerceklesen"); data.Columns.Add("Para_Birimi"); data.Rows.Add("10", "10", "USD"); data.Rows.Add("20", "20", "TL"); data.Rows.Add("30", "30", "GB"); data.Rows.Add("40", "40", "EUR"); gridControl1.DataSource = data; } private void gridView1_CustomColumnDisplayText(object sender, DevExpress.XtraGrid.Views.Base.CustomColumnDisplayTextEventArgs e) { CultureInfo USD = new CultureInfo("en-US"); CultureInfo EUR = new CultureInfo("fr-FR", false); CultureInfo TL = new CultureInfo("tr-TR", false); CultureInfo GB = new CultureInfo("en-GB", false); ColumnView view = sender as ColumnView; if (e.Column.FieldName == "Onaylanan" && e.ListSourceRowIndex != DevExpress.XtraGrid.GridControl.InvalidRowHandle) { string currencyType = view.GetRowCellValue(e.ListSourceRowIndex, gridView1.Columns["Para_Birimi"]).ToString(); decimal para = Convert.ToDecimal(e.Value); switch (currencyType) { case "USD": e.DisplayText = string.Format(USD, "{0:C}", para); break; case "TL": e.DisplayText = string.Format(TL, "{0:C}", para); break; case "GB": e.DisplayText = string.Format(GB, "{0:C}", para); break; case "EUR": e.DisplayText = string.Format(EUR, "{0:C}", para); break; } } if (e.Column.FieldName == "Gerceklesen" && e.ListSourceRowIndex != DevExpress.XtraGrid.GridControl.InvalidRowHandle) { string currencyType = view.GetRowCellValue(e.ListSourceRowIndex, gridView1.Columns["Para_Birimi"]).ToString(); decimal para = Convert.ToDecimal(e.Value); switch (currencyType) { case "USD": e.DisplayText = string.Format(USD, "{0:C}", para); break; case "TL": e.DisplayText = string.Format(TL, "{0:C}", para); break; case "GB": e.DisplayText = string.Format(GB, "{0:C}", para); break; case "EUR": e.DisplayText = string.Format(EUR, "{0:C}", para); break; } } } private void button1_Click(object sender, EventArgs e) { (gridControl1.MainView as DevExpress.XtraGrid.Views.Grid.GridView).AddNewRow(); } } } [/spoiler] Quote Link to comment Share on other sites More sharing options...
muratboy31 Posted June 5, 2015 Author Share Posted June 5, 2015 Şöyle anlatıym; benim aslında veri tabanından çektiğim veriler var ama ben yeni bir veri eklemek istediğimde bunu direk grid üzerinden satır ekleyerek yapmak istiyorum ve yeni eklenen satırlarıda sonrasında veri tabanınına kayıt etmek istiyorum veya bir satırda günecelleme yapılmış ise onu da kayıt etmek istiyorum. Quote Link to comment Share on other sites More sharing options...
KintaRo Posted June 5, 2015 Share Posted June 5, 2015 dediğim gibi yeni satırı boş ekleyemezsiniz bu şekilde. Eklemek için ya gridView1_CustomColumnDisplayText kodlarını try catch içine alın ya da gridView.AddRow("0", "0", "TL"); gibi sıfır değerler ekleyin. Quote Link to comment Share on other sites More sharing options...
muratboy31 Posted June 5, 2015 Author Share Posted June 5, 2015 anladım teşekkürler KintaRo bir sorum daha var, acaba dediğim gibi bir kayıt işlemini nasıl yaptırabilirim ( Grid üzerindeki satırlarda değişiklik yapılabilecek ve bu değişiklikler ve yeni eklenen kayıtlar bir buton ile veri tanabıba kayıt edilecek. Yani değişiklik yapılan satırlar UPDATE ve yeni eklenen satırlar INSERT olacak.) Quote Link to comment Share on other sites More sharing options...
KintaRo Posted June 5, 2015 Share Posted June 5, 2015 valla DataSource olarak gridControl'e eklenen verilerin SQL'e güncel olarak tekrar aktarımı için kesin kısa bir yol vardır ama ben bilmiyorum. Ben olsam şöyle yapardım şu şekilde bir gridControlümüz olduğunu düşünelim: [table] [tr] [td]kod[/td] [td]isim[/td] [td]yas[/td] [/tr] [tr] [td]100[/td] [td]kintaro[/td] [td]33[/td] [/tr] [tr] [td]101[/td] [td]pairs[/td] [td]45[/td] [/tr] [/table] int count = gridView1.RowCount; if (count > 0) { for (i=0; i < count; i++) { string kod = gridView1.GetRowCellDisplayText(i, gridView1.Columns[0]); // sql den bu kodlu kayıt varmı diye bakalım //eğer kayıt varsa // verileri alıp sql de ki satırı update edelim //eğer kayıt yoksa // satırdaki verilerle yeni bir kayıt ekleyelim. } } Quote Link to comment Share on other sites More sharing options...
muratboy31 Posted June 5, 2015 Author Share Posted June 5, 2015 peki sanal oluşturulan bir kolon varsa ve sql tablosunda bu kolon mevcut değilse nasıl yapmam gerekir ? aşağıdaki HarcamaOrani kolunu gibi , runtime da oluşturulan bir kolon ve ben bunu pas geçmek istiyorum gridden guncelleme yaparken. ALTER PROCEDURE [dbo].[sp_Kayit_Listele] AS BEGIN SELECT Para_Birimi, Onaylanan, Gerceklesen, ((Gerceklesen / Onaylanan) * 100) as 'HarcamaOrani' FROM hepsi.dbo.[Kayitlar] END Quote Link to comment Share on other sites More sharing options...
KintaRo Posted June 5, 2015 Share Posted June 5, 2015 benim verdiğim kodda kolon sayısını baz almak zorunda değilsin ki. istediğin kolonların verisini alacaksın tamamdır. int count = gridView1.RowCount; if (count > 0) { for (i=0; i < count; i++) { string kod = gridView1.GetRowCellDisplayText(i, gridView1.Columns[0]); string isim = gridView1.GetRowCellDisplayText(i, gridView1.Columns[1]); string yas = gridView1.GetRowCellDisplayText(i, gridView1.Columns[2]); // sql den bu kodlu kayıt varmı diye bakalım //eğer kayıt varsa Sql.QueryMetodu(String.Format("UPDATE kayitlar SET isim='{0}', yas='{1}' WHERE kod='{2}'", isim, yas, kod)); //eğer kayıt yoksa Sql.QueryMetodu(String.Format("INSERT INTO kayitlar (kod, isim, yas) VALUES ('{0}', '{1}', '{2}')", isim, yas, kod)); } } } } YANİ GELEN VERİLERİ İSTEDİĞİN KOLONLARA AKTARABİLİRSİN Quote Link to comment Share on other sites More sharing options...
muratboy31 Posted June 5, 2015 Author Share Posted June 5, 2015 Teşekkürler KintaRo çok yardımcı oldu, ufak bir sorum daha var, ben veri tabanına primary key olarak ID ile kayıt ediyorum (auto incremantal integer), ama bunu grid içerisinde göstermiyorum. satırı update edeceğimde yada yeni kayıt ettireceğimde primary key olmadan bunu nasıl bulabilirim ? Quote Link to comment Share on other sites More sharing options...
KintaRo Posted June 5, 2015 Share Posted June 5, 2015 Onu göstermeden bulmak zor olur onun yerine şu şekilde bir öneri sunabilirim: hem göster hem gösterme :) Yani Gride o kolonu da listelet ama gizle: gridView1.Columns[0].Visible = false; Bu şekilde yaparsan hem kullanıcıya görünmez, hem de kolonun ve hücrelerinin tüm fonksiyonlarını kullanabilirsin. Quote Link to comment Share on other sites More sharing options...
Editor pairs Posted June 5, 2015 Editor Share Posted June 5, 2015 Eğer databinding yaparsanız .DataSource u post etmenizle değiştirilmiş veriyi dbye post edebilirsiniz. Ve yeni satır eklemede ise grid in ItemNewRow property si vardı Run Designer da. üstte yada altta yeni satır gireceğiniz kısım açar yeni satırı kod ile açmayla uğraşmazsınız. Quote Link to comment Share on other sites More sharing options...
muratboy31 Posted June 5, 2015 Author Share Posted June 5, 2015 @ KintaRo cevap için çok teşekkürler kesinlkle kullanacam... @ pairs eğer mümkünse ufak bir örnek verebilir misin ? özellikle yeni satır ekleme konusunda... çok sevinirim... Quote Link to comment Share on other sites More sharing options...
Editor pairs Posted June 5, 2015 Editor Share Posted June 5, 2015 Mysql Örnek kullandım ben sen sql server veya ne kulanıyorsan ona göre çevirirsin. Databinding oldugu için hata verebilir belki. Quote Link to comment Share on other sites More sharing options...
muratboy31 Posted June 8, 2015 Author Share Posted June 8, 2015 (edited) dediğim gibi yeni satırı boş ekleyemezsiniz bu şekilde. Eklemek için ya gridView1_CustomColumnDisplayText kodlarını try catch içine alın ya da gridView.AddRow("0", "0", "TL"); gibi sıfır değerler ekleyin. gridView1_CustomColumnDisplayText eventında kullandığım try catch ile aldığım hata bu ; Edited June 8, 2015 by muratboy31 Quote Link to comment Share on other sites More sharing options...
KintaRo Posted June 8, 2015 Share Posted June 8, 2015 öncelikle şu yanlış: int rowHandle = gridView1.GetRowHandle(gridView1.DataRowCount); eğer gridde 5 satır varsa sana sonuç olarak 5 verecektir. Ama index 0'den başlayacağı için 5. row'u program bulamaz ve index hatası verir. int sonIndex= gridView1.RowCount - 1; dersen son row'un handle'ını alabilirsin. Ayrıca gridView1.AddNewRow(); komutunda eklenen yeni row handle olarak -2147483648 gibi bir rakam alacaktır. Bunu önlemek için gridView1.AddNewRow(); gridView1.UpdateCurrentRow(); derseniz sıradaki boş handle'ı atayacaktır. yani eski rowlar 0,1,2,3,4 gibi dizilmişse 5 noyu yeni row'a verecektir. Quote Link to comment Share on other sites More sharing options...
muratboy31 Posted June 8, 2015 Author Share Posted June 8, 2015 (edited) söylediğiniz düzenlemeleri yaptım ama bu sefer aşağıdaki hatayı verdi ! private void CreatNewRow(string string parabirimi, int onaylanan, int gerceklesen, string durum, DateTime tarih, string yol) { gridView1.AddNewRow(); gridView1.UpdateCurrentRow(); int rowHandle = gridView1.RowCount - 1; if (gridView1.IsNewItemRow(rowHandle)) { gridView1.SetRowCellValue(rowHandle, gridView1.Columns["Para_Birimi"], parabirimi); gridView1.SetRowCellValue(rowHandle, gridView1.Columns["Onaylanan"], onaylanan); gridView1.SetRowCellValue(rowHandle, gridView1.Columns["Gerceklesen"], gerceklesen); gridView1.SetRowCellValue(rowHandle, gridView1.Columns["Durum"], durum); gridView1.SetRowCellValue(rowHandle, gridView1.Columns["Tarih"], tarih); gridView1.SetRowCellValue(rowHandle, gridView1.Columns["Yol"], yol); } } private void simpleButton4_Click(object sender, EventArgs e) { CreatNewRow("", 1000, 100, "", Convert.ToDateTime("01.01.2015"), ""); } Edited June 8, 2015 by muratboy31 Quote Link to comment Share on other sites More sharing options...
KintaRo Posted June 8, 2015 Share Posted June 8, 2015 kolon tiplerini bilmiyorum ama sanırım boş değer kabul etmiyorlar. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.