Ana içeriğe geç

DataGrid

Verileri satır ve sütunlardan oluşan bir tablo halinde gösteren nesnedir. Bir veri kaynağına bağlanır; kullanıcı tablo üzerinde filtreleme, sıralama, arama yapabilir, satır ekleyip silebilir ve hücreleri yerinde düzenleyebilir. Koddan da satır ekleyip okuyabilir, seçili satırları işleyebilirsiniz.

Ne zaman kullanılır?

Çok sayıda kaydı tek ekranda listelemek, kullanıcıya tablo üzerinde satır ekletmek/sildirmek ya da bir veri kaynağındaki kayıtları seçtirmek istediğinizde idealdir. Sipariş kalemleri, masraf satırları, malzeme listeleri gibi tekrar eden kayıtlar için kullanılır. Tek bir kayıt seçtirmek için Lookup, ağaç (üst-alt) yapısı için TreeList daha uygundur.

Değer tipi: Bu nesnenin tek bir Value değeri yoktur. DataGrid bir satır koleksiyonu (Rows) tutar; her satır (DataGridRow) hücrelerden (DataGridCell) oluşur. Bir hücreye satır indeksleyicisiyle erişirsiniz: satir["SütunAdı"] size bir DataGridCell döndürür, değeri okumak için .Value, ekrandaki metni için .Text kullanırsınız.

Tasarımcı özellikleri

Bir DataGrid seçildiğinde Özellik Görüntüleyici birkaç sekmeye ayrılır.

General

ÖzellikAçıklama
NameNesnenin koddaki adı (ör. DataGrid1). Koddan bu adla erişirsiniz.
CaptionTablonun yanındaki etiket (çok dilli).

Data Source

DataGrid'in gösterdiği veriyi bu sekme belirler.

ÖzellikAçıklama
DataSourceTablonun bağlandığı veri kaynağı. Satırlar buradan gelir.
DataSourceTypeVeri kaynağının türü (sorgu, liste, statik veri vb.).

Columns (sütun modeli)

Columns, bir DataGridColumnCollection içinde DataGridColumn nesneleri tutar. Her sütunun zengin bir tanımı vardır.

DataGridColumn üyesiAçıklama
NameSütunun alan adı. Hücreye bu adla erişirsiniz: satir["Name"].
CaptionSütun başlığı (Dictionary<String,String>, çok dilli).
DbTypeSütunun veri türü (ColumnDbType).
EditTypeHücre editör türü (ColumnEditType: metin, sayı, tarih, seçim vb.).
FormulaHesaplanmış sütun formülü.
Format / FormatTypeGösterim biçimi (ör. para, tarih).
IsPrimaryKeySütunun anahtar (kimlik) olup olmadığı.
AllowNullBoş değere izin verir.
DefaultValueYeni satırda varsayılan değer.
Sorting / FilteringSütun bazlı sıralama / filtre ayarları.
SummaryTypesSütun altında toplam/ortalama gibi özet satırı.
VisibleSütunu gizler/gösterir.
Width / PreferredWidthSütun genişliği.
ShowEditorAlwaysHücreyi sürekli düzenlenebilir gösterir.

DataGridActionButtonColumn, DataGridColumn'dan türeyen özel bir sütun türüdür; hücre yerine bir işlem butonu (ActionButtonProps) gösterir ve tıklanınca ActionButtonClick olayını tetikler.

Behavior

ÖzellikAçıklama
EditingSatır içi düzenleme ayarları: ekleme, güncelleme, silme açık mı.
FilteringSütun bazlı filtre satırını açar.
SearchingTablonun üstüne genel arama kutusu ekler.
SortingSütun başlığına tıklayarak sıralamayı açar.
GroupingSatırları bir sütuna göre gruplamayı açar.
PagingVerileri sayfalara böler.
SelectionSatır seçimini ve seçim türünü (tekli/çoklu) ayarlar.
DetailRowHer satırın altında açılan detay paneli tanımlar.
TreeViewSatırları ağaç (üst-alt) yapısında gösterir.
RowDraggingSatırların sürükle-bırak ile yeniden sıralanmasına izin verir.
BatchOperationsToplu işlem (birden çok satırı bir arada kaydetme) ayarları.
ToolbarActionButtonsTablo araç çubuğuna eklenen özel işlem butonları (ExecuteActionButton).
ColumnAutoWidthSütun genişliklerinin içeriğe göre otomatik ayarlanmasını sağlar.
ColumnFixingEnabledBir sütunun sola/sağa sabitlenmesine izin verir.
ColumnHidingEnabledDar ekranlarda sütunların otomatik gizlenmesine izin verir.
ColumnVerticalBorderSütunlar arasına dikey çizgi koyar.
PreferredWidthTypeSütun genişliği davranışını belirler (piksel / yüzde vb.).
RowsTablodaki satır koleksiyonu (DataGridRowCollection). Koddan erişilir.
GetAllRowsFiltreden bağımsız bütün satırları döndürür (salt okunur).
SelectedRowsKullanıcının seçtiği satırların koleksiyonu (salt okunur).
SelectedRowKeysSeçili satırların anahtar değerleri (List<Object>).
SelectedRowsDataSeçili satırların verisi (List<Dictionary<String,Object>>).
HiddenRowColumnNameHangi sütun değerine göre satırın gizleneceğini belirler.
HiddenRowValueMatchersGizlenecek satır değerlerini eşleştiren kurallar.
ExportToExcelTabloyu Excel'e aktarma butonunu açar.
ShowClearAllButton"Tümünü temizle" butonunu gösterir.
VirtualScrollingÇok sayıda satırda performans için satırları kademeli yükler.
CacheSettingsEnabledVeri kaynağı sonuçlarının önbelleğe alınmasını açar.
HoverStateEnabledFare üzerine gelince satırı vurgular.
WordWrapEnabledUzun metinlerin hücre içinde alt satıra geçmesini sağlar.
FillFormSeçilen satırın verisini form alanlarına doldurur.
SaveAction / SaveModeTablo değişikliklerinin kaydetme adımında nasıl işleneceğini belirler.
ReadOnlyTabloyu salt okunur yapar; düzenleme kapanır.
RequiredTablonun en az bir satır içermesini zorunlu kılar.
LoadingTablonun yükleniyor durumunu gösterir (Boolean).
IndexableSatırların indekslenip indekslenmeyeceği.
HeightTablonun yüksekliği (piksel).
ContextMenuKey / ContextMenuColumnKey / ContextMenuTargetTabloya/satıra/sütuna sağ tık menüsü bağlar.

Appearance

ÖzellikAçıklama
Visible / Client VisibleNesnenin görünürlüğü.
Enabled / Client EnabledNesnenin aktif olup olmadığı.
TitleTablonun başlığı (MultiLanguageText, çok dilli).
GridLinesTablo çizgilerinin türü (DataGridLineType: yatay / dikey / ikisi / yok).
GridBorderTablonun dış kenarlığını gösterir.
AlternateColorSatırları bir açık bir koyu renklendirir (zebra deseni).
DisplayTypeTablonun görünüm biçimi (DataGridDisplayType).
Style / ContainerStyleTablonun ve kapsayıcısının stili.
CustomClassNameÖzel CSS sınıfı.
Bu nesnede olmayan özellikler

DataGrid'in Text, Placeholder, TextAlign ve tek bir Value özelliği yoktur. Bunlar metin giriş nesnelerine (EditControl) aittir. DataGrid CompositeDataBoundControl'den türer ve veriyi yalnızca satır/sütun üzerinden tutar.

Olaylar

DataGrid'in olayları satır işlemleri etrafında döner. Genel yaşam döngüsü olayları (OnInit / OnLoad / OnRender vb.) bu nesnenin gerçek üyeleri değildir; aşağıdaki listeler nesnenin gerçekten tetiklediği olaylardır.

Olaylar iki tarafta çalışabilir: sunucu olayları C# kodunda, istemci olayları tarayıcıdaki TypeScript kodunda işlenir.

Sunucu olayları (Server)

OlayArgüman tipiNe zaman çalışır
RowInsertingRowInsertingEventArgs (Row, Cancel)Yeni satır eklenmeden önce. İptal edilebilir.
RowInsertedRowInsertedEventArgs (Row)Satır eklendikten sonra.
RowUpdatingRowUpdatingEventArgs (NewRow, OldRow, Cancel)Satır güncellenmeden önce. İptal edilebilir.
RowUpdatedRowUpdatedEventArgs (NewRow, OldRow)Satır güncellendikten sonra.
RowRemovingRowRemovingEventArgs (Row, Cancel)Satır silinmeden önce. İptal edilebilir.
RowRemovedRowRemovedEventArgs (Row)Satır silindikten sonra.
RowEditingStartRowEditingStartEventArgs (Row, Cancel)Bir satır düzenlenmeye başlandığında.
RowSelectionChangedRowSelectionChangedEventArgs (NewRow, OldRow)Seçili satır değiştiğinde. En sık kullanılan olaydır.
ActionButtonClickActionButtonClickEventArgsSatır içi işlem butonuna basılınca.
ToolbarButtonClickToolbarButtonClickEventArgsAraç çubuğu butonuna basılınca.
BeforeToolbarButtonClickBeforeToolbarButtonClickEventArgsAraç çubuğu butonu işlenmeden hemen önce.
SetValueChangeSetCellValueChangeEventArgsBir hücre değeri kod ile atandığında.
ValidatingEventValidatingEventArgs (salt okunur)Tablo doğrulanırken (kaydetmeden önce).
Satır olaylarının argümanları farklıdır

Argüman tipini olaya göre seçin; aynı isimle her olayda e.Row yoktur:

  • RowInserting / RowInserted / RowRemoving / RowRemoved / RowEditingStarte.Row (tip Object) taşır. Satır olarak kullanmak için (DataGridRow)e.Row cast'i gerekir.
  • RowUpdating / RowUpdated / RowSelectionChangede.NewRow ve e.OldRow taşır; bunlarda e.Row yoktur.
  • Cancel yalnızca ...ing olaylarında (RowInserting, RowUpdating, RowRemoving, RowEditingStart) vardır; e.Cancel = true işlemi iptal eder. ...ed olaylarında işlem artık gerçekleşmiştir.

İstemci olayları (Client)

İstemci tarafında aynı satır olayları (RowInserting, RowUpdating, RowRemoving, RowSelectionChanged, RowEditingStart, ActionButtonClick, ToolbarButtonClick) TypeScript kodunda da işlenebilir.

Kod örnekleri

DataGrid'e iki yerden erişirsiniz: form kodunda doğrudan tipli nesne adıyla (DataGrid1), akış kodunda ise yalnızca Control tutarsınız ve GridData JSON yolu kullanılır. Sunucu örnekleri turuncu, istemci örnekleri kırmızı çerçevelidir.

Hücre okuma kuralı (en sık yapılan hata)

Satır indeksleyicisi satir["SütunAdı"] size bir DataGridCell döndürür, doğrudan değeri değil. Değeri okumak için .Value, ekrandaki metni için .Text kullanın:

object tutar = satir["Tutar"].Value; // gerçek değer
string metin = satir["Tutar"].Text; // ekrandaki metin

var deger = satir["Tutar"]; yazarsanız değeri değil, hücre nesnesini almış olursunuz.

Form kodu: satırları gezme ve hücre okuma (C#, sunucu)

Form kodunda nesneye doğrudan tipli adıyla erişirsiniz:

// Tüm satırları gez ve hücre değerini oku
decimal toplam = 0;
foreach (DataGridRow satir in DataGrid1.Rows)
{
decimal tutar = Convert.ToDecimal(satir["Tutar"].Value ?? 0);
string aciklama = satir["Aciklama"].Text;
toplam += tutar;
}

// Satır sayısı (filtreden bağımsız tüm satırlar)
int satirSayisi = DataGrid1.GetAllRows.Count;

// Belirli bir hücreyi indeksle oku
object hucre = DataGrid1.GetCellValue(0, 1); // 0. satır, 1. sütun

Form kodu: bir veri kaynağı döngüsünden satır ekleme (C#, sunucu)

Tipli grid'e satır eklemenin doğrulanmış yolu NewRow() → hücreleri doldur → Rows.Add()Reload() döngüsüdür.

// Önce mevcut satırları temizle (yeniden kurmak için)
DataGrid1.Rows.Clear();

foreach (var kalem in malzemeler) // malzemeler: sorgudan/listeden gelen kayıtlar
{
DataGridRow satir = DataGrid1.NewRow();
satir["MalzemeNo"].Value = kalem.MalzemeNo;
satir["MalzemeNo"].Text = kalem.MalzemeNo.ToString();
satir["MalzemeAdi"].Value = kalem.Ad;
satir["MalzemeAdi"].Text = kalem.Ad;
satir["Miktar"].Value = kalem.Miktar;
satir["Miktar"].Text = kalem.Miktar.ToString();
DataGrid1.Rows.Add(satir);
}

// Değişiklikleri ekrana yansıt
DataGrid1.Reload();

Tek seferde değerlerle satır oluşturmak isterseniz NewRowWithValues kullanabilirsiniz:

var degerler = new Dictionary<string, object>
{
["MalzemeNo"] = "M-1001",
["MalzemeAdi"] = "Vida M6",
["Miktar"] = 250
};
DataGridRow satir = DataGrid1.NewRowWithValues(degerler, "tr-TR", null);
DataGrid1.Rows.Add(satir);
DataGrid1.Reload();

Form kodu: seçili satırı form alanlarına doldurma (RowSelectionChanged, C#, sunucu)

RowSelectionChanged seçili satır değiştiğinde çalışır. Argümanda e.Row yoktur; e.NewRow kullanılır ve DataGridRow'a cast edilir.

void DataGrid1_RowSelectionChanged(object sender, RowSelectionChangedEventArgs e)
{
if (e.NewRow == null) return;
DataGridRow satir = (DataGridRow)e.NewRow;

// Seçili satırın hücrelerini form alanlarına doldur
TextBox_MalzemeAdi.Value = satir["MalzemeAdi"].Value?.ToString();
TextBox_MalzemeAdi.Text = satir["MalzemeAdi"].Text;
NumericBox_Miktar.Value = Convert.ToDecimal(satir["Miktar"].Value ?? 0);
}

Form kodu: bir satırın silinmesini engelleme (RowRemoving, C#, sunucu)

RowRemoving satır silinmeden hemen önce çalışır; e.Row (tip Object) taşır, DataGridRow'a cast edip değeri .Value ile okuyun, e.Cancel = true ile silmeyi iptal edin.

void DataGrid1_RowRemoving(object sender, RowRemovingEventArgs e)
{
var satir = (DataGridRow)e.Row;
// Onaylanmış satırların silinmesini engelle
if (((DataGridRow)e.Row)["Durum"].Value?.ToString() == "Onaylandı")
{
e.Cancel = true;
ShowMessage("Uyarı", "Onaylanmış satır silinemez.",
Bimser.CSP.FormControls.RuleManager.AlertType.Validation);
}
}

Form kodu: yeni satırı doğrulayıp eklemeyi iptal etme (RowInserting, C#, sunucu)

RowInserting yeni satır eklenmeden önce çalışır; e.Row taşır ve e.Cancel = true eklemeyi iptal eder.

void DataGrid1_RowInserting(object sender, RowInsertingEventArgs e)
{
var satir = (DataGridRow)e.Row;
decimal miktar = Convert.ToDecimal(satir["Miktar"].Value ?? 0);
if (miktar <= 0)
{
e.Cancel = true; // geçersiz satırın eklenmesini engelle
ShowMessage("Uyarı", "Miktar sıfırdan büyük olmalıdır.",
Bimser.CSP.FormControls.RuleManager.AlertType.Validation);
}
}

Form kodu: seçili satırları okuma ve bir sütunu toplama (C#, sunucu)

// Kullanıcının seçtiği satırları işle
decimal seciliToplam = 0;
foreach (DataGridRow satir in DataGrid1.SelectedRows)
{
seciliToplam += Convert.ToDecimal(satir["Tutar"].Value ?? 0);
}

// Seçili satırların ham verisi (alan-değer sözlüğü olarak)
List<Dictionary<string, object>> seciliVeri = DataGrid1.SelectedRowsData;

Akış (Flow) kodu: GridData JSON yolu (C#, sunucu)

Akış kodunda yalnızca bir Control tutarsınız; tipli DataGrid yüzeyi yoktur. Bu durumda GridData.FromControl(ctrl) ile yazılabilir bir kopya alır, GridDataRow / GridDataRowCell(value, name) ile satır ekler ve sonucu form verisine yazarsınız.

// 1. Grid kontrolünü yazılabilir bir GridData'ya çevir
Control gridCtrl = Document1.Controls["DataGrid1"];
GridData grid = GridData.FromControl(gridCtrl);

// 2. Satırları kur ve ekle (hücreler (değer, sütunAdı) şeklinde)
foreach (var kalem in malzemeler)
{
var yeniSatir = new GridDataRow
{
Cells = new List<GridDataRowCell>
{
new GridDataRowCell(kalem.MalzemeNo, "MalzemeNo"),
new GridDataRowCell(kalem.Ad, "MalzemeAdi"),
new GridDataRowCell(kalem.Miktar, "Miktar"),
}
};
grid.Rows.Add(yeniSatir);
}

// 3. Tüm grid'i JSON olarak kontrol değerine yaz, birleştir ve kaydet
FormData fd = new FormData();
fd.ControlValues.Add("DataGrid1", JsonConvert.SerializeObject(grid));
Document1.MergeData(fd.ControlValues);
Document1.Save();

Akış tarafında satırları okumak için yine GridData.FromControl kullanılır; hücreler sütun Name'iyle eşleştirilir:

Control ctrl = Document1.Controls["DataGrid1"];
GridData grid = GridData.FromControl(ctrl);
foreach (GridDataRow satir in grid.Rows)
{
var hucre = satir.Cells
.FirstOrDefault(c => c.Name == "Miktar");
object miktar = hucre?.Value;
}

İstemci kodu (TypeScript, tarayıcı)

İstemci tarafında nesnelere this. ile erişilir ve özellik adları küçük harfle yazılır:

// Seçili satır anahtarlarını oku
const secili = this.DataGrid1.selectedRowKeys;

// Tabloyu görünür/gizli yap
this.DataGrid1.visible = true;

DataGridRow ve DataGridCell üyeleri

Satırları kodla dolaşırken bu üyeleri kullanırsınız.

DataGridRow üyesiAçıklama
satir["SütunAdı"]İndeksleyici; bir DataGridCell döndürür.
CellsSatırdaki tüm hücreler (DataGridCellCollection).
CellDataHücre verisi sözlüğü (Dictionary<String,Object>).
DataSatırın alan-değer verisi (Dictionary<String,Object>).
SelectedSatır seçili mi (Boolean).
RowIdSatırın kimliği (Nullable<Int64>).
IndexSatırın sırası (Int32).
NameSatırın adı.
ToDictionary()Satırı sözlüğe çevirir.
DataGridCell üyesiAçıklama
ValueHücrenin saklanan değeri (Object).
TextHücrenin ekrandaki metni (String).
NameHücrenin (sütunun) adı.
IndexHücrenin sütun sırası.
EditTypeHücre editör türü (ColumnEditType).

Metotlar

MetotAçıklama
NewRow(int? index)Boş bir DataGridRow üretir (henüz eklemez).
NewRowWithValues(Dictionary<string,object> values, string userLanguage, int? index)Değerleriyle dolu bir DataGridRow üretir.
Rows.Add(row)Satırı tabloya ekler.
Rows.Clear()Tüm satırları siler.
Reload()Değişiklikleri ekrana yansıtır (satır ekleme/silme sonrası gerekir).
GetCellValue(int rowIndex, int cellIndex)Tek bir hücrenin değerini indeksle döndürür.
GetRowValues(int rowIndex)Tek bir satırın değerlerini döndürür.
GetSelectedRows()Seçili satırları döndürür.
LoadFrom(DataTable table)Grid'i bir DataTable'dan doldurur.
ClearDataSource()Bağlı veri kaynağını temizler.

İpuçları

  • Bir hücreyi okurken mutlaka .Value ya da .Text kullanın; satir["Sütun"] tek başına hücre nesnesidir, değer değildir.
  • Satır ekleme/silme sonrası değişikliklerin ekrana yansıması için Reload() çağırın.
  • Akış kodunda yalnızca Control tutuyorsanız GridData.FromControl yolunu, form kodunda tipli DataGrid nesnesi varsa NewRow() / Rows.Add / Reload() yolunu kullanın.
  • Satır olaylarında argüman tipini doğru seçin: ...ing olaylarında e.Cancel vardır; RowUpdating / RowSelectionChanged'de e.Row yerine e.NewRow / e.OldRow kullanılır.
  • Çok sayıda kayıt gösterecekseniz Paging ya da VirtualScrolling açın; aksi halde tablo yavaşlar.
  • En az bir satır zorunlu olsun istiyorsanız kodla kontrol etmek yerine Required özelliğini kullanın.
  • Kullanıcının seçtiği satırı form alanlarına doldurmak için tasarımdaki FillForm özelliğini açabilir ya da RowSelectionChanged ile kod yazabilirsiniz.
Tüm tasarımcı özellikleri ve olaylar (tam liste)

General: Name, Caption

Data Source: DataSource, DataSourceType

Columns: Columns (DataGridColumnCollection / DataGridColumn), ColumnSettings, DataGridActionButtonColumn

Behavior: AlternateColor, BatchOperations, CacheSettingsEnabled, ColumnAutoWidth, ColumnFixingEnabled, ColumnHidingEnabled, ColumnVerticalBorder, ContextMenuColumnKey, ContextMenuKey, ContextMenuTarget, DetailRow, DisplayType, Editing, EntityPath, ExportToExcel, FillForm, Filtering, GetAllRows, GridBorder, GridLines, Grouping, Height, HiddenRowColumnName, HiddenRowValueMatchers, HoverStateEnabled, Indexable, Loading, Paging, PreferredWidthType, ReadOnly, Required, RowDragging, Rows, SaveAction, SaveMode, Searching, SelectedRowKeys, SelectedRows, SelectedRowsData, Selection, ShowClearAllButton, Sorting, ToolbarActionButtons, TreeView, VirtualScrolling, WordWrapEnabled

Appearance: ClientEnabled, ClientVisible, ContainerStyle, CustomClassName, Enabled, GridBorder, GridLines, Style, Title, Visible

Olaylar (Server / Client): ActionButtonClick, BeforeToolbarButtonClick, RowEditingStart, RowInserted, RowInserting, RowRemoved, RowRemoving, RowSelectionChanged, RowUpdated, RowUpdating, SetValueChange, ToolbarButtonClick, ValidatingEvent

Metotlar: NewRow, NewRowWithValues, Rows.Add, Rows.Clear, Reload, GetCellValue, GetRowValues, GetSelectedRows, GetValueAsObject, GetData, LoadFrom, ClearDataSource