Aracılığıyla paylaş

DataGridView CheckBox İşaretleme Sorunu

SAMET GÜLER 20 Saygınlık puanı
2025-03-16T10:16:12.8866667+00:00

Öncelikle herkese hayırlı günler diliyorum.

Projemin sonuna geldim ancak 1 haftadır çözemediğim bir sorunum var.
DataGridView1 tablosunda ilk sütun checbox sütunudur.
DataGridView1 tablosunun başlıkları kendi içinden girilmiştir.

Bu kodlar ile;

  • Sadece tabloda yer alan ILACBILGISI sütunu dolu olan satırları işaretliyor.
    İşaretlendikten sonra bu ilk işaretleme ise, satırdaki SIRANO bilbisini comboBox1.SelectedIndex özelliğine aktarıyor.
  • Eğer bu ilk işaretleme değilse, farklı kişiye ait bir satırın işaretlenmesine izin vermiyor. Aynı kişiye ait farklı satırların işaretlemesine izin veriyor.
  • Aynı kişiye ait diğer satırlar işaretlenirse, ilk işaretleme dahil işaretli olan satırın İndex bilgisi DataGridViewRowIds listesine aktarılıyor.
  • e.RowIndex.ToString(), ILACADI, KULLANIMSEKLI, ILACBILGISI bilgileri ise selectedRowsData listesine aktarılıyor.

Sorunum şunlar;
1- CheckBox sütununda sağlıklı/düzgün işaretleme yapamıyorum. Her tıklamaya işaretlemiyor yada işareti kaldırmıyor. Bazı zamanlarda işaretli olduğu halde, DataGridViewRowIds listesi boş oluyor yada DataGridViewRowIds listesi dolu olduğu halde işaretli checkBox olmuyor. Yani genel olarak her tıklamaya tepki vermedği zamanlar oluyor. Bu nedenle de DataGridViewRowIds sayısı ile check edilenler/işaretli olanların sayısı tutmuyor. Bunun nedeni comboBox1.SelectedIndex = index2; satırı olduğunu keşfettim ancak alakası nedir yada ne gibi bir değişiklik yapmam gerekiyor bilemiyorum

Cevaplarınız için şimdiden çok teşekkür ediyorum.

private List<int> DataGridViewRowIds = new List<int>();
private List<List<string>> selectedRowsData = new List<List<string>>();

private void Form63_Load(object sender, EventArgs e)
{
    dataGridView1.Columns[0].Width = 55;//SECIM
    dataGridView1.Columns[1].Width = 175;//ADISOYADI            
    dataGridView1.Columns[2].Width = 80;//TC            
    dataGridView1.Columns[3].Width = 275;//ILACADI            
    dataGridView1.Columns[4].Width = 150;//KULLANIMSEKLI            
    dataGridView1.Columns[5].Width = 115;//VERILEBILECEGITARIH
    dataGridView1.Columns[6].Width = 115;//RAPORBASLANGICTARIHI
    dataGridView1.Columns[7].Width = 115;//RAPORBITISTARIHI
    dataGridView1.Columns[8].Width = 150;//ILACBILGISI
    dataGridView1.Columns[9].Width = 50;//SIRANO
    dataGridView1.Columns[10].Width = 50;//HIZMETALANSIRANO


    dataGridView1.Columns[5].DefaultCellStyle.Format = "dd.MM.yyyy";
    dataGridView1.Columns[6].DefaultCellStyle.Format = "dd.MM.yyyy";
    dataGridView1.Columns[7].DefaultCellStyle.Format = "dd.MM.yyyy";

    ADISOYADII();
    LISTELE();
}


private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    if (dataGridView1.IsCurrentCellInEditMode)
    {
        dataGridView1.EndEdit();
    }
    TCC();
    SIRANOLISTELE();
    VERILERILISTELE();
    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        DataGridViewCheckBoxCell chk2 = (DataGridViewCheckBoxCell)row.Cells[0];
        chk2.Value = false;
    }
    DataGridViewRowIds.Clear();
    selectedRowsData.Clear();
}


private void LISTELE()
{
    using (SQLiteDataAdapter komut5 = new SQLiteDataAdapter(@"SELECT
    ADISOYADI,
    TC,
    ILACADI, 
    KULLANIMSEKLI, 
    COALESCE(strftime('%d.%m.%Y', VERILEBILECEGITARIH), '') AS VERILEBILECEGITARIH, 
    COALESCE(strftime('%d.%m.%Y', RAPORBASLANGICTARIHI), '') AS RAPORBASLANGICTARIHI, 
    COALESCE(strftime('%d.%m.%Y', RAPORBITISTARIHI), '') AS RAPORBITISTARIHI,
    ILACBILGISI,
    SIRANO,
    HIZMETALANSIRANO
        FROM ILAC 
        WHERE
        ILACKRONIKMISORUSU='EVET' 
        GROUP BY ADISOYADI,ILACADI 
        ORDER BY ADISOYADI,ILACADI ASC;", baglanti))
    {
        dTable.Clear();
        komut5.Fill(dTable);
        dataGridView1.DataSource = dTable;
    }
    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        foreach (DataGridViewCell cell in row.Cells)
        {
            cell.ReadOnly = true;
        }
    }
    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        row.Cells[0].ReadOnly = false;
        row.Cells[8].ReadOnly = false;
    }
    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        // İlk sütundaki tüm hücreleri false yap
        row.Cells[0].Value = false;  // veya true diyebilirsiniz
    }
}


private string firstSelectedAdSoyad = null;
private string firstSelectedSiraNo = null;
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
    if (dataGridView1.IsCurrentCellInEditMode)
    {
        dataGridView1.EndEdit();
    }
    if (e.ColumnIndex != 0 || e.ColumnIndex == -1 || e.RowIndex == -1 || dataGridView1.RowCount == 0)
    {
        return;
    }
    else
    {
        if (dataGridView1.Rows[e.RowIndex].Cells[8].Value == null || string.IsNullOrWhiteSpace(dataGridView1.Rows[e.RowIndex].Cells[8].Value.ToString()))
        {
            MessageBox.Show("İLAÇ BİLGİSİ ALANINI DOLDURMADAN SEÇİM YAPAMAZSINIZ.", "UYARI", MessageBoxButtons.OK, MessageBoxIcon.None);
            dataGridView1.Rows[e.RowIndex].Cells[0].Value = false;
            return;
        }
        {
            string selectedAdSoyad = dataGridView1.Rows[e.RowIndex].Cells["ADISOYADI"].Value?.ToString();
            string selectedSiraNo = dataGridView1.Rows[e.RowIndex].Cells["HIZMETALANSIRANO"].Value?.ToString();
            if (firstSelectedAdSoyad == null)
            {
                firstSelectedAdSoyad = selectedAdSoyad;
                firstSelectedSiraNo = selectedSiraNo;
                int index2 = -1;
                for (int i = 0; i < comboBox1.Items.Count; i++)
                {
                    DataRowView row = comboBox1.Items[i] as DataRowView;
                    if (row != null && row["SIRANO"].ToString() == firstSelectedSiraNo)
                    {
                        index2 = i;
                        break;
                    }
                }
                if (index2 != -1)
                {
                    comboBox1.SelectedIndex = index2;
                }
            }
            else
            {
                if (selectedSiraNo != firstSelectedSiraNo)
                {
                    MessageBox.Show("SADECE AYNI KİŞİYE AİT İLAÇLARI SEÇEBİLİRSİNİZ.", "UYARI", MessageBoxButtons.OK, MessageBoxIcon.None);
                    return;
                }
            }
        }
        if (Convert.ToBoolean(dataGridView1.Rows[e.RowIndex].Cells[0].EditedFormattedValue) == true)
        {
            if (!DataGridViewRowIds.Contains(e.RowIndex))
            {
                // Check edilirse, satır index'ine göre listelere ekle
                DataGridViewRowIds.Add(e.RowIndex);
                string ilacAdi = dataGridView1.Rows[e.RowIndex].Cells["ILACADI"].Value?.ToString() ?? "";
                string kullanimSekli = dataGridView1.Rows[e.RowIndex].Cells["KULLANIMSEKLI"].Value?.ToString() ?? "";
                string ilacBilgisi = dataGridView1.Rows[e.RowIndex].Cells["ILACBILGISI"].Value?.ToString() ?? "";
                selectedRowsData.Add(new List<string> { e.RowIndex.ToString(), ilacAdi, kullanimSekli, ilacBilgisi });
                
                textBox10.Text = selectedRowsData.Count.ToString();
                UpdateListBox(); // ListBox'ı güncelle
            }
        }
        else
        {
            // Check kaldırıldıysa, satır index'ine göre listeden çıkar
            int index = DataGridViewRowIds.IndexOf(e.RowIndex);
            if (index != -1)
            {
                DataGridViewRowIds.RemoveAt(index);
                //selectedRowsData.RemoveAt(index);
                selectedRowsData.RemoveAll(row => row[0] == e.RowIndex.ToString());
                textBox10.Text = selectedRowsData.Count.ToString();
                UpdateListBox();
            }
        }
    }
    if (selectedRowsData.Count == 0)
    {
        firstSelectedAdSoyad = null;
        firstSelectedSiraNo = null;
        comboBox1.SelectedIndex = -1;
        dTable2.Clear();
        TEMIZLE();
    }
}



C#
C#
C dil ailesine kökenleri olan ve bileşen odaklı programlama desteği içeren nesne odaklı ve tür açısından güvenli bir programlama dili.
8 soru
0 yorum Açıklama yok
{count} oy

Kabul edilen yanıt
  1. Onur Can Alemdaroğlu 80 Saygınlık puanı
    2025-03-16T17:03:23.7966667+00:00

    DataGridView'deki CheckBox sütununda yaşadığınız sorunun ana nedeni, comboBox1'in SelectedIndex değiştiğinde tetiklenen olayların ve hücre tıklamalarının birbirleriyle çakışması olabilir.

    İşte sorunun çözümü için gerekli değişiklikler:

    // ... mevcut kod ...
    private bool isComboBoxChanging = false;
    
    private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
    {
        if (dataGridView1.IsCurrentCellInEditMode)
        {
            dataGridView1.EndEdit();
        }
        if (e.ColumnIndex != 0 || e.ColumnIndex == -1 || e.RowIndex == -1 || dataGridView1.RowCount == 0)
        {
            return;
        }
        else
        {
            // Mevcut değeri kontrol et
            bool currentValue = Convert.ToBoolean(dataGridView1.Rows[e.RowIndex].Cells[0].EditedFormattedValue);
            
            // İlaç bilgisi kontrolü
            if (!currentValue && (dataGridView1.Rows[e.RowIndex].Cells[8].Value == null || 
                string.IsNullOrWhiteSpace(dataGridView1.Rows[e.RowIndex].Cells[8].Value.ToString())))
            {
                MessageBox.Show("İLAÇ BİLGİSİ ALANINI DOLDURMADAN SEÇİM YAPAMAZSINIZ.", "UYARI", MessageBoxButtons.OK, MessageBoxIcon.None);
                dataGridView1.Rows[e.RowIndex].Cells[0].Value = false;
                return;
            }
            
            string selectedAdSoyad = dataGridView1.Rows[e.RowIndex].Cells["ADISOYADI"].Value?.ToString();
            string selectedSiraNo = dataGridView1.Rows[e.RowIndex].Cells["HIZMETALANSIRANO"].Value?.ToString();
            
            if (firstSelectedAdSoyad == null && !currentValue)
            {
                firstSelectedAdSoyad = selectedAdSoyad;
                firstSelectedSiraNo = selectedSiraNo;
                
                isComboBoxChanging = true;
                int index2 = -1;
                for (int i = 0; i < comboBox1.Items.Count; i++)
                {
                    DataRowView row = comboBox1.Items[i] as DataRowView;
                    if (row != null && row["SIRANO"].ToString() == firstSelectedSiraNo)
                    {
                        index2 = i;
                        break;
                    }
                }
                if (index2 != -1)
                {
                    comboBox1.SelectedIndex = index2;
                }
                isComboBoxChanging = false;
            }
            else if (selectedSiraNo != firstSelectedSiraNo && !currentValue)
            {
                MessageBox.Show("SADECE AYNI KİŞİYE AİT İLAÇLARI SEÇEBİLİRSİNİZ.", "UYARI", MessageBoxButtons.OK, MessageBoxIcon.None);
                dataGridView1.Rows[e.RowIndex].Cells[0].Value = false;
                return;
            }
            
            // CheckBox değerini değiştir
            dataGridView1.Rows[e.RowIndex].Cells[0].Value = !currentValue;
            
            if (!currentValue) // Yani şimdi true olacak
            {
                if (!DataGridViewRowIds.Contains(e.RowIndex))
                {
                    // Check edilirse, satır index'ine göre listelere ekle
                    DataGridViewRowIds.Add(e.RowIndex);
                    string ilacAdi = dataGridView1.Rows[e.RowIndex].Cells["ILACADI"].Value?.ToString() ?? "";
                    string kullanimSekli = dataGridView1.Rows[e.RowIndex].Cells["KULLANIMSEKLI"].Value?.ToString() ?? "";
                    string ilacBilgisi = dataGridView1.Rows[e.RowIndex].Cells["ILACBILGISI"].Value?.ToString() ?? "";
                    selectedRowsData.Add(new List<string> { e.RowIndex.ToString(), ilacAdi, kullanimSekli, ilacBilgisi });
                    
                    textBox10.Text = selectedRowsData.Count.ToString();
                    UpdateListBox(); // ListBox'ı güncelle
                }
            }
            else // Yani şimdi false olacak
            {
                // Check kaldırıldıysa, satır index'ine göre listeden çıkar
                int index = DataGridViewRowIds.IndexOf(e.RowIndex);
                if (index != -1)
                {
                    DataGridViewRowIds.RemoveAt(index);
                    selectedRowsData.RemoveAll(row => row[0] == e.RowIndex.ToString());
                    textBox10.Text = selectedRowsData.Count.ToString();
                    UpdateListBox();
                }
            }
        }
        
        if (selectedRowsData.Count == 0)
        {
            firstSelectedAdSoyad = null;
            firstSelectedSiraNo = null;
            
            isComboBoxChanging = true;
            comboBox1.SelectedIndex = -1;
            isComboBoxChanging = false;
            
            dTable2.Clear();
            TEMIZLE();
        }
    }
    
    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (isComboBoxChanging)
            return;
            
        if (dataGridView1.IsCurrentCellInEditMode)
        {
            dataGridView1.EndEdit();
        }
        
        TCC();
        SIRANOLISTELE();
        VERILERILISTELE();
        
        foreach (DataGridViewRow row in dataGridView1.Rows)
        {
            DataGridViewCheckBoxCell chk2 = (DataGridViewCheckBoxCell)row.Cells[0];
            chk2.Value = false;
        }
        
        DataGridViewRowIds.Clear();
        selectedRowsData.Clear();
        firstSelectedAdSoyad = null;
        firstSelectedSiraNo = null;
    }
    // ... mevcut kod ...
    
    
    1 kişi bu yanıtı yararlı buldu.

0 ek yanıt

Sıralama ölçütü: En yararlı

Yanıtınız

Yanıtlar, soru yazarı tarafından Kabul Edilen Yanıt olarak işaretlenebilir ve bu da kullanıcıların, yanıtın yazarın sorununu çözdüğünü anlamasına yardımcı olur.