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