Jump to content

Gridview1_Customcolumndisplaytext Sorun Hk.


muratboy31
 Share

Recommended Posts

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 by muratboy31
Link to comment
Share on other sites

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.

 

FwUKDwC.png

 

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]

Link to comment
Share on other sites

Şö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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.)

Link to comment
Share on other sites

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.
	}
}
Link to comment
Share on other sites

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
Link to comment
Share on other sites

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
Link to comment
Share on other sites

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 ?

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

  • Editor

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.

Link to comment
Share on other sites

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 ;

dz9e04.jpg

Edited by muratboy31
Link to comment
Share on other sites

ö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.

Link to comment
Share on other sites

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"), "");          
        }

15mnqr8.jpg

Edited by muratboy31
Link to comment
Share on other sites

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.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...