31 Mayıs 2020 Pazar

DataGridView Sınıfı

DataGridView
CurrentCell Alanı
Şöyle yaparız
if (grid.Rows.Count > 0)
{
  grid.Rows[0].Selected = true;
  grid.CurrentCell = grid.Rows[0].Cells[0];
}
CurrentRow Alanı
Açıklaması şöyle. Sadece bu çağrıyı yapmak yetmez.
To change the current row, you must set the CurrentCell property to a cell in the desired row.
Örnek
Şöyle yaparız.
dataGridView1.CurrentRow.Cells[2].Value.ToString()
DataSource Alanı
Oject tipindendir. Çok farklı çeşitlerde veriyi kullanabiliyor. Liste verirsek nesnenin public property alanlarını gösterir. Şöyle yaparız.
List<Foo> list = ...;
dataGridView1.DataSource = list;
Dizi için şöyle yaparız.
Foo[] data = ...
dataGridView1.DataSource = data;
Bu alana DataSet veya DataTable tipinden nesneler de atanabilir.

ReadOnly Alanı
Şöyle yaparız
void InitializeGrid()
{
  grid.ReadOnly = true;
  grid.AllowUserToAddRows = false;
  grid.AllowUserToDeleteRows = false;
  grid.MultiSelect = false;
  grid.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
  grid.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
  grid.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
  ...
}
RowCount Alanı
Sütun sayısı şöyle kontrol edilir.
if (dataGridView1.RowCount > 0){...}
Rows Alanı
Satırlara Rows alanı ile erişiriz. Aynı bir dizide olduğu gibi silme, ekleme çıkarma yapılabilir. DataGridViewRow yazısına taşıdım.

SelectionMode Alanı
Şöyle yaparız.
dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
VirtualMode
Eğer gösterilecek liste çok büyükse VirtualMode kullanılmalı. DataGridViewCellValueEventArgs parametresi hangi satırın istendiğini belirtir. Şöyle yaparız.
dataGridView1.VirtualMode = true;
dataGridView1.CellValueNeeded += new
        DataGridViewCellValueEventHandler(dataGridView1_CellValueNeeded);
Daha sonra event handler şöyle yazılır. e nesnesinin RowIndex ve ColumnIndex değerleri ile hangi hücrenin istendiği bulunur. e.Value ile hücreye değer atanır.
void dataGridView1_CellValueNeeded(object sender,
        System.Windows.Forms.DataGridViewCellValueEventArgs e)
{
  if (e.RowIndex == this.dataGridView1.RowCount - 2 && e.ColumnIndex == 0)
  {
    return;
  }

  e.Value = DSg.Tables[0].Rows[e.RowIndex][e.ColumnIndex];
}

Diğer Metodlar
Sütun Formatı
Sütun formatı değiştirilebilir.
dataGridView1.Columns[0].DefaultCellStyle.Format = "h:mm tt";
Sütun Olarak Checkbox
Checkbox sütun şöyle eklenir.
DataGridViewCheckBoxColumn col = new DataGridViewCheckBoxColumn() 
{
  Name = "Check"
};
dataGridView1.Columns.Add(col);
Daha sonra bu sütunun işaretli olup olmadığını  şöyle kontrol ederiz.
DataGridViewRow row = dataGridView1.Rows[1];
if (Convert.ToBoolean(row.Cells[0].Value) == true) {...}
CheckBox'ları işaretlemek için şöyle yaparız.
foreach (DataGridViewRow row in dataGridView1.Rows)
{
  //Check Column 3 for quantity        
  if (row.Cells[3].Value.ToString() == "0")
  {   
    //Get checkbox in column 1 and cast it to a checkbox
    DataGridViewCheckBoxCell cell = row.Cells[1] as DataGridViewCheckBoxCell;     
    cell.Value = cell.TrueValue;
  }
}

Renk Değiştirme
AlternatingRowsDefaultCellStyle alanında BackColor farklı bir renk seçilirse, her tek satır yeni renk ile boyanır.

SelectedRows
Tüm seçili satırla şöyle silinebilir. Satır nesnesini sildiğimiz için indeks'lerin kaymasından etkilenmeyiz.
foreach (var row in dataGridView1.SelectedRows)
{
    dataGridView1.Rows.Remove(row);
}

SelectedCell
Seçili tüm hücreler şöyle dolaşılır. Her hücrenin Value, FormattedValue ve EditedFormattedValue isimli alanları vardır.
// Iterate through the SelectedCells collection and sum up the values. 
for (counter = 0;counter < (myGridView.SelectedCells.Count); counter++)
{
    if (myGridView.SelectedCells[counter].FormattedValueType ==
        Type.GetType("System.String"))
    {
        string value = null;

        // If the cell contains a value that has not been commited, 
        // use the modified value. 
        if (myGridView.IsCurrentCellDirty == true)
        {

            value = myGridView.SelectedCells[counter]
                .EditedFormattedValue.ToString();
        }
        else
        {
            value = myGridView1.SelectedCells[counter]
                .FormattedValue.ToString();
        }
        if (value != null)
        {
            // Ignore cells in the Description column. 
            if (myGridView1.SelectedCells[counter].ColumnIndex !=
                myGridView1.Columns["Description"].Index)
            {
                if (value.Length != 0)
                {
                    SelectedCellTotal += int.Parse(value);
                }
            }
        }
    }
}
Eventler
CellBeginEdit
Hücre düzenlenmeye başlanınca tetiklenir. Şöyle yaparız.
dataGridView1.CellBeginEdit += grvItems_CellBeginEdit;
CellEndEdit
Odak (focus) bir başka hücreye geçince tetiklenir.
dataGridView1.CellEndEdit += grvItems_CellEndEdit;
Metod şöyledir.
void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{

  if (e.ColumnIndex == dataGridView1.Columns["Quantity"].Index)
  {
    dataGridView1.EndEdit();
  }
}
CellClick
e parametresinin RowIndex ve ColumnIndex alanları önemli. Şöyle yaparız.
void OnCellClick(object sender, DataGridViewCellEventArgs e)
{
  if(e.ColumnIndex==1 && e.RowIndex>-1)
  {
    var column = (DataGridViewComboBoxColumn)myGridView1.Columns[e.ColumnIndex];
  }
}
Şöyle yaparız.
void grid_CellClick(object sender, DataGridViewCellEventArgs e)
{
  if (e.RowIndex < 0) {...}
  if (e.ColumnIndex == 1) {...}

}
CellFormatting
e parametresinin RowIndex ve ColumnIndex alanları önemli. Ayrıca e.Value ile yeni değer atarız. Şöyle yaparız.
void grid_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
  if (e.RowIndex < 0)
    return;

  //I supposed the image column is at index 1
  if (e.ColumnIndex == 1)
    e.Value = Properties.Resources.SomeImage;
}

CellPainting
Şöyle yaparız.
void dataGridView1_CellPainting(object sender,DataGridViewCellPaintingEventArgs e)
{
  if ((e.RowIndex % 2) == 0)         
    e.CellStyle.BackColor = Color.NavajoWhite;         
}
e.Graphics alanı ile çizim yapılabilir.
void grid_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
  if (e.RowIndex < 0)
    return;

  //I supposed your button column is at index 0
  if (e.ColumnIndex == 0)
  {
    e.Paint(e.CellBounds, DataGridViewPaintParts.All);

    var w = Properties.Resources.SomeImage.Width;
    var h = Properties.Resources.SomeImage.Height;
    var x = e.CellBounds.Left + (e.CellBounds.Width - w) / 2;
    var y = e.CellBounds.Top + (e.CellBounds.Height - h) / 2;

    e.Graphics.DrawImage(Properties.Resources.SomeImage, 
                         new Rectangle(x, y, w, h));
    e.Handled = true;
  }
}

CellValidating
CellValidating için örnek
void OnCellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
    int currentCell = TestGrid.CurrentCell.ColumnIndex;
    var oldValue = TestGrid[e.ColumnIndex, e.RowIndex].Value;
    var newValue = TestGrid[e.ColumnIndex, e.RowIndex].EditedFormattedValue;
    /* Perform some logic here*/
}
ColumnAdded
İmzası şöyle
public event DataGridViewColumnEventHandler ColumnAdded
Handler şöyle yazılır.
void DataGridView1_ColumnAdded(Object sender, DataGridViewColumnEventArgs e) {

  if(e.Column.ValueType is DateTime) {
    e.Column = new MyCalendarColumn();
  }
}
EditingControlShow 
örnek
void OnEditingControlShowing(object sender, 
                             DataGridViewEditingControlShowingEventArgs e)
{
    
  if (this.myGridView1.CurrentCell.ColumnIndex == 1)
  {
    var comboBox = e.Control as DataGridViewComboBoxEditingControl;
    comboBox.Click -= comboBox_Click;
    comboBox.Click += comboBox_Click;
  }
}
RowsAdded
Her eklenen satır için çağrılır. Şöyle yaparız.
void OnRowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{
  DataGridViewRow row = dataGridView1.Rows[e.RowIndex];
  ...
}







1 yorum: