• 15-03-2020, 13:32:37
    #1
    Merhaba, sizden bir konuda yardım rica ediyorum.
    Datatable da yer alan Operasyon_1, Operasyon_2, Operasyon_3 vs. şeklinde kolonlarım var.
    örnek olarak resim ekledim. değerler bazen farklı kolonlarda olabiliyor. ben 6 kolondaki değerleri alıp benzersiz "key" lere dönüştürmek istiyorum.
    Ortak yaptığım bu kelimeleri checkbox listesine eklemek istiyorum. tümü işaretli olacak ilk form load olduğunda (orasını ben hallederim)
    Halledemediğim ikinci kısım ise;
    bu checkbox ta işaretini kaldırdığımı hangi kolonda olursa olsun bulur datatable dan kaldıracak. yani kalan checkboxları filtreli olarak tutacak datatable da.
    biraz karmaşık mı oldu bilemedim? yardım edebilir misiniz bana bu konuda?
  • 15-03-2020, 18:27:57
    #2
    ufukt51 adlı üyeden alıntı: mesajı görüntüle
    Merhaba, sizden bir konuda yardım rica ediyorum.
    Datatable da yer alan Operasyon_1, Operasyon_2, Operasyon_3 vs. şeklinde kolonlarım var.
    örnek olarak resim ekledim. değerler bazen farklı kolonlarda olabiliyor. ben 6 kolondaki değerleri alıp benzersiz "key" lere dönüştürmek istiyorum.
    Ortak yaptığım bu kelimeleri checkbox listesine eklemek istiyorum. tümü işaretli olacak ilk form load olduğunda (orasını ben hallederim)
    Halledemediğim ikinci kısım ise;
    bu checkbox ta işaretini kaldırdığımı hangi kolonda olursa olsun bulur datatable dan kaldıracak. yani kalan checkboxları filtreli olarak tutacak datatable da.
    biraz karmaşık mı oldu bilemedim? yardım edebilir misiniz bana bu konuda?
    class IndexInfo
    {
    public IndexInfo(int rowIndex, int columnIndex)
    {
    this.RowIndex = rowIndex;
    this.ColumnIndex = columnIndex;
    }
    public int RowIndex { get; set; }
    public int ColumnIndex { get; set; }
    }
    class UniqueList
    {
    private Dictionary<string, List<IndexInfo>> DicValues = new Dictionary<string, List<IndexInfo>>();
    public void Add(string value, int rowIndex, int columnIndex)
    {
    if (DicValues.TryGetValue(value, out List<IndexInfo> list))
    {
    list.Add(new IndexInfo(rowIndex, columnIndex));
    }
    else
    {
    list = new List<IndexInfo>();
    list.Add(new IndexInfo(rowIndex, columnIndex));
    DicValues.Add(value, list);
    }
    }
    
    public IEnumerable<IndexInfo> GetIndexList(string key)
    {
    if (DicValues.TryGetValue(key, out List<IndexInfo> list))
    {
    foreach (var index in list)
    {
    yield return index;
    }
    }
    else
    throw new Exception("Key sözlükte yok!");
    }
    public List<string> GetList()
    {
    return DicValues.Keys.ToList();
    }
    }
    UniqueList uniqueList = new UniqueList();
    private void Form1_Load(object sender, EventArgs e)
    {
    var con = DataBase.Ins.GetConnection();
    string query = "select * from TBLBANK";
    SqlCommand cmd = new SqlCommand(query, con);
    con.Open();
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    da.Fill(dataTable);
    con.Close();
    da.Dispose();
    
    dataGridView1.DataSource = dataTable;
    
    for (int i = 0; i < dataTable.Rows.Count; i++)
    {
    var row = dataTable.Rows[i];
    for (int x = 0; x < dataTable.Columns.Count; x++)
    {
    if (x > 0) // id dışındaki kolonlar
    uniqueList.Add(row[x].ToString(), i, x);
    
    }
    }
    chckList.DataSource = uniqueList.GetList();
    
    for (int i = 0; i < chckList.Items.Count; i++)
    {
    chckList.SetItemChecked(i, true);
    }
    chckList.ItemCheck += chckList_ItemCheck;
    }
    
    private void chckList_ItemCheck(object sender, ItemCheckEventArgs e)
    {
    var checkList = sender as CheckedListBox;
    var dataTable = dataGridView1.DataSource as DataTable;
    
    foreach (var index in uniqueList.GetIndexList(checkList.Items[e.Index].ToString()))
    {
    if (e.NewValue == CheckState.Checked)
    dataTable.Rows[index.RowIndex][index.ColumnIndex] = checkList.Items[e.Index].ToString();
    else
    dataTable.Rows[index.RowIndex][index.ColumnIndex] = "";
    }
    }
  • 15-03-2020, 21:58:58
    #3
    pr1d3 adlı üyeden alıntı: mesajı görüntüle
    class IndexInfo
    {
    satırlardaki değerleri birleştirme işini çözdüm. Birinci aşama tamam. ikinci aşama Checkbox işaretini kaldırdığımda, datatable da ilgili satırları kaldırmak kaldı.
    List<string> operasyonlar = new List<string>();
    for (int iz = 0; iz < AdvancedDataGridView1.Rows.Count; iz++)
    {
    string op1_kolon = Convert.ToString(AdvancedDataGridView1.Rows[iz].Cells[13].Value);
    string op2_kolon = Convert.ToString(AdvancedDataGridView1.Rows[iz].Cells[14].Value);
    string op3_kolon = Convert.ToString(AdvancedDataGridView1.Rows[iz].Cells[15].Value);
    string op4_kolon = Convert.ToString(AdvancedDataGridView1.Rows[iz].Cells[16].Value);
    string op5_kolon = Convert.ToString(AdvancedDataGridView1.Rows[iz].Cells[17].Value);
    string op6_kolon = Convert.ToString(AdvancedDataGridView1.Rows[iz].Cells[18].Value);
    
    operasyonlar.Add(op1_kolon);
    operasyonlar.Add(op2_kolon);
    operasyonlar.Add(op3_kolon);
    operasyonlar.Add(op4_kolon);
    operasyonlar.Add(op5_kolon);
    operasyonlar.Add(op6_kolon);
    
    if (iz == AdvancedDataGridView1.Rows.Count-1)
    {
    string[] essizIsımDizisi = CleanNulled(operasyonlar.Distinct().ToArray());
    foreach (string ops in essizIsımDizisi)
    {
    ChkList.Items.Add(ops, true);
    }
    }
    }
    boş satırlar vardı onları temizlemek içinde aşağıdaki fonksiyonu kullandım.
     private string[] CleanNulled(string[] array)
    {
    string Items = String.Empty;
    for (int i = 0; i < array.Length; i++)
    {
    if (!String.IsNullOrEmpty(array[i].Trim()))
    {
    Items += array[i] + "|";
    }
    }
    string[] clean = Items.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
    return clean;
            }
  • 15-03-2020, 22:33:33
    #4
    ufukt51 adlı üyeden alıntı: mesajı görüntüle
    satırlardaki değerleri birleştirme işini çözdüm. Birinci aşama tamam. ikinci aşama Checkbox işaretini kaldırdığımda, datatable da ilgili satırları kaldırmak kaldı.
    List<string> operasyonlar = new List<string>();
    for (int iz = 0; iz < AdvancedDataGridView1.Rows.Count; iz++)
    {
    string op1_kolon = Convert.ToString(AdvancedDataGridView1.Rows[iz].Cells[13].Value);
    string op2_kolon = Convert.ToString(AdvancedDataGridView1.Rows[iz].Cells[14].Value);
    string op3_kolon = Convert.ToString(AdvancedDataGridView1.Rows[iz].Cells[15].Value);
    string op4_kolon = Convert.ToString(AdvancedDataGridView1.Rows[iz].Cells[16].Value);
    string op5_kolon = Convert.ToString(AdvancedDataGridView1.Rows[iz].Cells[17].Value);
    string op6_kolon = Convert.ToString(AdvancedDataGridView1.Rows[iz].Cells[18].Value);
    
    operasyonlar.Add(op1_kolon);
    operasyonlar.Add(op2_kolon);
    operasyonlar.Add(op3_kolon);
    operasyonlar.Add(op4_kolon);
    operasyonlar.Add(op5_kolon);
    operasyonlar.Add(op6_kolon);
    
    if (iz == AdvancedDataGridView1.Rows.Count-1)
    {
    string[] essizIsımDizisi = CleanNulled(operasyonlar.Distinct().ToArray());
    foreach (string ops in essizIsımDizisi)
    {
    ChkList.Items.Add(ops, true);
    }
    }
    }
    boş satırlar vardı onları temizlemek içinde aşağıdaki fonksiyonu kullandım.
     private string[] CleanNulled(string[] array)
    {
    string Items = String.Empty;
    for (int i = 0; i < array.Length; i++)
    {
    if (!String.IsNullOrEmpty(array[i].Trim()))
    {
    Items += array[i] + "|";
    }
    }
    string[] clean = Items.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
    return clean;
    }
    Datatabledaki hücrelere müdahale edebilmek için her birinin satır ve sütun sıralarını bilmek gerekiyor. Benim çözümümde dictionary benzersizliği sağlıyor, hücre değeri key olarak kullanılıyor ve datatable da ne kadar aynı key değerden varsa satır ve sütun sıraları listede saklanıyor. Bu key değerler liste olarak checkboxliste datasource olarak atanıyor ve gösteriliyor. Checkboxlist ItemCheck eventi ile seçilen keyin datatableda geçtiği bütün sıralar key değeri ile seçimi kaldırılan keyin geçtiği sıralar ise boş olarak set ediliyor. Yani hem key hemde sıralar unutulmuyor.
  • 16-03-2020, 14:44:26
    #5
    @pr1d3; emeğine sağlık valla hiç üşenmeden yardım etti saatlerce ve çokta bilgili birisi teşekkür ederim.
  • 16-03-2020, 14:49:56
    #6
    ufukt51 adlı üyeden alıntı: mesajı görüntüle
    @pr1d3; emeğine sağlık valla hiç üşenmeden yardım etti saatlerce ve çokta bilgili birisi teşekkür ederim.
    Rica ederim hocam, yardımcı olabildiğime sevindim