Spalten in datagrid mit checkboxen anzeigen

  • C#
  • .NET 5–6

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von Kathiii.

    Spalten in datagrid mit checkboxen anzeigen

    Hallo,

    ich habe ein datagrid das mit daten aus einer sql datenbank gefüllt wird. Außerdem habe ich mehrere checkboxen die ich gerne mit dem datagrid verbinden würde, weiß aber nicht wie ich das ganze angehen soll, da keiner meiner versuche geklappt hat bis auf einen. Mit diesem habe ich aber über 8000 Zeilen code mit einer verschachtelten if-else-funktion, die etwas unschön ist. Kann mir da jemand weiterhelfen?
    LG Kathi
    datagrid oder DataGridView?

    Kathiii schrieb:

    Außerdem habe ich mehrere checkboxen die ich gerne mit dem datagrid verbinden würde
    Was konkret soll das heißen? Mach mal ein Wunschbild und lad es hoch. Oder erklär ausführlich, was Du meinst.

    Kathiii schrieb:

    bis auf einen
    Nämlich?

    Kathiii schrieb:

    Mit diesem habe ich aber über 8000 Zeilen code mit einer verschachtelten if-else-funktion
    Das ist Dein Problem. Aber Spaß beiseite: Es ist Deine Aufgabe, das 8000-Zeilen-Monster so zu bändigen, dass es eben keine 8000 Zeilen sind. Ist das nur eine eizige 8000-Zeilen-Methode? Ich hoffe nicht. Keine sollte m.E. länger als 20 (ja 20!) Zeilen sein. Und selbst das ist schon hochgegriffen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Kathiii schrieb:

    (...) bis auf einen. Mit diesem habe ich aber über 8000 Zeilen code mit einer verschachtelten if-else-funktion, die etwas unschön ist (...)

    Sehr euphemistisch ausgedrückt, denn es ist vermutlich die schlechteste Art solche Problemstellungen irgendwie so hardgecodet und ausgeschrieben zu lösen und obendrein bekommt man auch noch steife Finger nach ein paar Stunden tastaturschlagen. Normalerweise nutzt man Schleifen & Co. oder auch Bindungen, in denen man etwas durchautomatisieren und die Arbeit auf die CPU bzw. das Framework abwälzen kann - Probleme mit den steifen Fingern gibt es auf der anderen Seite nicht, egal wieviele Iterationen durchgelaufen sind, dafür könnte es aber andere Probleme geben, wenn man es nicht richtig, nicht sauber und ohne entsprechende Sicherungen macht.
    Das gleichzeitige Erscheinen von Dummheit und Unmündigkeit nach Immanuel Kant ist eines der schlimmsten Dinge, die einem Homo sapiens in geistiger Hinsicht widerfahren können, hat manchmal aber auch durchaus seine Vorteile.
    Solange nicht klar ist, was Du konkret hast und konkret willst, kann Dir wohl niemand helfen. Meine Glaskugel zumindest ist noch immer in Reparatur ;(
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Kathiii schrieb:

    Mein Problem ist ja genau das. Ich finde keine Schleife die ich nutzen kann (...)

    Vielleicht einfach mal zwei oder drei von diesen mit STRG+C und STRG+V kopierten und dann per Hand modifizierten Iterationen, mit denen man die 8000 Zeilen tapfer erstellt hat oder ursprünglich erstellen wollte, hier den Leuten posten, damit man überhaupt weiß, was und wie eventuell durchexerziert werden könnte oder müsste.
    Das gleichzeitige Erscheinen von Dummheit und Unmündigkeit nach Immanuel Kant ist eines der schlimmsten Dinge, die einem Homo sapiens in geistiger Hinsicht widerfahren können, hat manchmal aber auch durchaus seine Vorteile.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Gregor Jasinski“ ()

    C#-Quellcode

    1. if (Vorname.IsChecked == true)
    2. {
    3. if (Nachname.IsChecked == true)
    4. {
    5. if (Land.IsChecked == true)
    6. {
    7. if (Wohnort.IsChecked == true)
    8. {
    9. if (Straße.IsChecked == true)
    10. {
    11. if (Hausnr.IsChecked == true)
    12. {
    13. if (Email.IsChecked == true)
    14. {
    15. if (Telefonnr.IsChecked == true)
    16. {
    17. if (Preis.IsChecked == true)
    18. {
    19. string CmdString = string.Empty;
    20. using (SqlConnection con = getSqlConnection())
    21. {
    22. CmdString = "select * from MitgliedmitInfos";
    23. SqlCommand cmd = new SqlCommand(CmdString, con);
    24. SqlDataAdapter sda = new SqlDataAdapter(cmd);
    25. DataTable dt = new DataTable();
    26. sda.Fill(dt);
    27. MainGrd.ItemsSource = dt.DefaultView;
    28. }
    29. }
    30. else
    31. {
    32. string CmdString = string.Empty;
    33. using (SqlConnection con = getSqlConnection())
    34. {
    35. CmdString = "select Vorname, Nachname, Land, Wohnort, Straße, Hausnummer, Emailadresse, Telefonnummer from MitgliedmitInfos";
    36. SqlCommand cmd = new SqlCommand(CmdString, con);
    37. SqlDataAdapter sda = new SqlDataAdapter(cmd);
    38. DataTable dt = new DataTable();
    39. sda.Fill(dt);
    40. MainGrd.ItemsSource = dt.DefaultView;
    41. }
    42. }
    43. }
    44. }
    45. }
    46. }
    47. }
    48. }
    49. }
    50. }

    Das wäre der erste Teil
    Ich habe immer eine checkbox passend zu jeder zeile. Das DataGrid wird mit

    C#-Quellcode

    1. ​var sqlConnection = getSqlConnection();
    2. try
    3. {
    4. string CmdString = string.Empty;
    5. using (SqlConnection con = getSqlConnection())
    6. {
    7. CmdString = "select * from MitgliedmitInfos";
    8. SqlCommand cmd = new SqlCommand(CmdString, con);
    9. SqlDataAdapter sda = new SqlDataAdapter(cmd);
    10. DataTable dt = new DataTable();
    11. sda.Fill(dt);
    12. MainGrd.ItemsSource = dt.DefaultView;
    13. }
    14. }
    15. catch (Exception e)
    16. {
    17. MessageBox.Show(e.ToString());
    18. }

    gefüllt.
    Bitte lade Bilder mit der Datei-Anhäng-Funktion des Forums hoch.
    Auf FremdHoster gehe ich nicht, und dein obiger Link ist eh kaputt, scheint mir.
    Vermutlich ist das Bild nötig, weil ohne das verstehe ich den Satz überhaupt nicht: "Ich habe immer eine checkbox passend zu jeder zeile."


    Bislang kann ich sagen, ich habe

    C#-Quellcode

    1. var sqlConnection = getSqlConnection();
    2. try
    3. {
    4. string CmdString = string.Empty;
    5. using (SqlConnection con = getSqlConnection())
    6. {
    7. CmdString = "select * from MitgliedmitInfos";
    8. SqlCommand cmd = new SqlCommand(CmdString, con);
    9. SqlDataAdapter sda = new SqlDataAdapter(cmd);
    10. DataTable dt = new DataTable();
    11. sda.Fill(dt);
    12. MainGrd.ItemsSource = dt.DefaultView;
    13. }
    14. }
    15. catch (Exception e)
    16. {
    17. MessageBox.Show(e.ToString());
    18. }
    jetzt schon an drei stellen gesehen.
    Mach das in eine Methode, der du den CmdString übergibst, und ruf dann diese Methode auf, anstatt immer denselben Code neu herumzukopieren.
    Ich hab den Code schon als eigene Methode, ich rufe sie immer auf anstatt die immer neu zu schreiben. Ich hab das Bild schon versucht anders anzuhängen, aber das hat nicht funktioniert. Also, ich habe zb die CheckBox 'Vorname' mit dem Namen 'cb_Vorname' und auch in der Tabelle in der Datenbank die Spalte 'Vorname'. Wenn die Checkbox 'Vorname' gecheckt ist möchte ich die Spalte 'Vorname' anzeigen, wenn sie nicht gecheckt ist soll die Spalte ausgeblendet werden.
    An Kathiii:

    die fabrizierte IF-Treppe lässt sich vereinfachen. Hast Du sie schon real getestet oder ist das nur so geschrieben, wie Du Dir das gedacht hast? Wie funktioniert oder wie sollte die IF-Bedingung Deiner Meinung nach funktionieren - kannst Du in ein, zwei Sätzen sagen, was die machen soll, damit hier gleich kein Missverständnis entsteht?
    Das gleichzeitige Erscheinen von Dummheit und Unmündigkeit nach Immanuel Kant ist eines der schlimmsten Dinge, die einem Homo sapiens in geistiger Hinsicht widerfahren können, hat manchmal aber auch durchaus seine Vorteile.

    Kathiii schrieb:

    if (Vorname.IsChecked == true)
    {
    if (Nachname.IsChecked == true)
    {
    if (Land.IsChecked == true)
    {
    if (Wohnort.IsChecked == true)
    {
    if (Straße.IsChecked == true)
    {
    if (Hausnr.IsChecked == true)
    {
    if (Email.IsChecked == true)
    {
    if (Telefonnr.IsChecked == true)
    {
    if (Preis.IsChecked == true)
    {


    Du kannst diese ganzen Abfragen a) vereinfachen und b) zusammenfügen:

    C#-Quellcode

    1. var queryString = string.Empty;
    2. if (
    3. !Vorname.IsChecked || // wenn du dringend alle Werte brauchst, einfach das ! entfernen und || durch && ersetzen
    4. !Nachname.IsChecked ||
    5. !Land.IsChecked ||
    6. !Wohnort.IsChecked ||
    7. !Straße.IsChecked ||
    8. !Hausnr.IsChecked ||
    9. !Email.IsChecked ||
    10. !Telefonnr.IsChecked ||
    11. !Preis.IsChecked
    12. ) {
    13. queryString = "SELECT * FROM MitfliedInfos";
    14. } else {
    15. queryString = "SELECT [werte] FROM MitgliedInfos";
    16. }


    Eine Alternative wäre, mittels Event alle CheckBoxen automagisch abzufragen, dann die Spalten entsprechend in eine Liste zu speichern und die durchzuiterieren:

    C#-Quellcode

    1. class Foo {
    2. private List<string> m_columns = new List<string>();
    3. public Foo() {
    4. checkbox1.CheckedChanged += checkbox_CheckedChanged;
    5. checkbox2.CheckedChanged += checkbox_CheckedChanged;
    6. // sinngemäß fortlaufend
    7. }
    8. private void checkbox_CheckedChanged(object? sender, EventArgs e) {
    9. if (sender is null) { return; }
    10. if (sender is CheckBox cBox) {
    11. if (!cBox.Checked && m_columns.Contains(cBox.Text)) {
    12. m_columns.Remove(cBox.Text);
    13. } else if (cBox.Checked && m_columns.Contains(cBox.Text)) {
    14. return; // Wert existiert bereits
    15. } else {
    16. m_columns.Add(cBox.Text);
    17. }
    18. }
    19. }
    20. private void SelectColumns() {
    21. var query = "SELECT * FROM MitgliedInfos;"
    22. if (m_columns.Count > 0) {
    23. var sBuilder = new StringBuilder();
    24. for (int i = 0; i < m_columns.Count; i++) {
    25. sBuilder.Append(m_columns[i]);
    26. if (i < m_columns.Count - 1) { sBuilder.Append(', '); }
    27. }
    28. query = query.Replace("*", sBuilder.ToString())
    29. }
    30. }
    31. }


    Das ist jetzt kein genauer Code, aber sollte dich auf die Sprünge helfen.
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems
    Meine Privatwebseite: SimonC.eu

    Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
    Ich versuche auf euch zurückzukommen :)

    Kathiii schrieb:

    Also, ich habe zb die CheckBox 'Vorname' mit dem Namen 'cb_Vorname' und auch in der Tabelle in der Datenbank die Spalte 'Vorname'. Wenn die Checkbox 'Vorname' gecheckt ist möchte ich die Spalte 'Vorname' anzeigen, wenn sie nicht gecheckt ist soll die Spalte ausgeblendet werden.
    Also du willst eine SelectionList zusammenstellen, deren Elemente durch Checkboxen bestimmt werden.
    Dassis doch recht einfach:

    C#-Quellcode

    1. var selectionList= new List<string>();
    2. if(ckVorname.IsChecked)selectionList.Add("Vorname");
    3. if(ckNachname.IsChecked)selectionList.Add("Name");
    4. [...]
    5. var sSelection=string.Join(", ",selectionList);
    6. var sql= $"select {sSelection} from MitgliedmitInfos";
    7. DataTable tb = ExecuteSql(sql);
    8. MainGrid.ItemsSource = tb.DefaultView;
    ExecuteSql() soll dabei die Methode sein, die Sql ausführen kann, und das Ergebnis returnt - du sagtest, du hättest so eine Methode schon.

    ErfinderDesRades schrieb:

    string.Join(", ",selectionList);


    Stimmt. Auf string.Join() hätte ich auch kommen können.
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems
    Meine Privatwebseite: SimonC.eu

    Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
    Ich versuche auf euch zurückzukommen :)
    Hallo, danke für eure Hilfe, ich habe doch alleine eine Lösung gefunden die anderen mit dem selben Problem auch finden kann

    C#-Quellcode

    1. ​var Vorname = MainGrd.Columns.FirstOrDefault(c => c.Header == cb_Vorname);
    2. var index1 = MainGrd.Columns.IndexOf(Vorname);
    3. var Nachname = MainGrd.Columns.FirstOrDefault(c => c.Header == cb_Nachname);
    4. var index2 = MainGrd.Columns.IndexOf(Nachname);
    5. var Land = MainGrd.Columns.FirstOrDefault(c => c.Header == cb_Land);
    6. var index3 = MainGrd.Columns.IndexOf(Land);
    7. var Wohnort = MainGrd.Columns.FirstOrDefault(c => c.Header == cb_Wohnort);
    8. var index4 = MainGrd.Columns.IndexOf(Wohnort);
    9. var Straße = MainGrd.Columns.FirstOrDefault(c => c.Header == cb_Straße);
    10. var index5 = MainGrd.Columns.IndexOf(Straße);
    11. var Hausnummer = MainGrd.Columns.FirstOrDefault(c => c.Header == cb_Hausnr);
    12. var index6 = MainGrd.Columns.IndexOf(Hausnummer);
    13. var Emailadresse = MainGrd.Columns.FirstOrDefault(c => c.Header == cb_Email);
    14. var index7 = MainGrd.Columns.IndexOf(Emailadresse);
    15. var Telefonnummer = MainGrd.Columns.FirstOrDefault(c => c.Header == cb_Telefonnr);
    16. var index8 = MainGrd.Columns.IndexOf(Telefonnummer);
    17. var Preis = MainGrd.Columns.FirstOrDefault(c => c.Header == cb_Preis);
    18. var index9 = MainGrd.Columns.IndexOf(Preis);
    19. List<int> index = new List<int>();
    20. index.Add(index1);
    21. index.Add(index2);
    22. index.Add(index1);
    23. index.Add(index3);
    24. index.Add(index4);
    25. index.Add(index5);
    26. index.Add(index6);
    27. index.Add(index7);
    28. index.Add(index8);
    29. index.Add(index9);
    30. var cbChecked = new Dictionary<string, bool>();
    31. cbChecked.Add("Vorname", cb_Vorname.IsChecked ?? true);
    32. cbChecked.Add("Nachname", cb_Nachname.IsChecked ?? true);
    33. cbChecked.Add("Land", cb_Land.IsChecked ?? true);
    34. cbChecked.Add("Wohnort", cb_Wohnort.IsChecked ?? true);
    35. cbChecked.Add("Straße", cb_Straße.IsChecked ?? true);
    36. cbChecked.Add("Hausnummer", cb_Hausnr.IsChecked ?? true);
    37. cbChecked.Add("Emailadresse", cb_Email.IsChecked ?? true);
    38. cbChecked.Add("Telefonnummer", cb_Telefonnr.IsChecked ?? true);
    39. cbChecked.Add("Preis", cb_Preis.IsChecked ?? true);
    40. foreach (var entry in cbChecked)
    41. {
    42. var targetColumn = MainGrd.Columns.FirstOrDefault(c => c.Header.ToString() == entry.Key);
    43. if(targetColumn != null)
    44. {
    45. if(entry.Value)
    46. {
    47. targetColumn.Visibility = Visibility.Visible;
    48. }
    49. else
    50. {
    51. targetColumn.Visibility = Visibility.Collapsed;
    52. }
    53. }
    54. }

    Ich hoffe es hilft jemanden weiter, fand die Art so mit dem Ausblenden ziemlich einleuchtend.

    Aber noch mal vielen Dank für eure Hilfe