none
[C#] DataGridView Positionsbestimmung von Elementen RRS feed

  • Frage

  • Hallo,

    Ich möchte in einem Datagridview bei klick auf ein Element Daten des Elementes in Textboxen angezeigt bekommen.
    Wenn ich also auf einen Firmennamen im datagridview klicke möchte ich die Adresse der Firma (die auch in der mit dem datagridview verknüpften Tabelle stehen) in Textboxen anzeigen lassen. 

    das funktioniert auch schon richtig gut.
    private void dataGridView1_RowEnter(object sender, DataGridViewCellEventArgs e) //bestimmt das aktuelle Element
    {
          active_row = e.RowIndex;
          setDataToFields();
    }
    
    private void setDataToFields()   //schreibt Daten in Textboxen
    {
          textBox2.Text = database1DataSet.Table1.ElementAt(active_row).Firma.ToString();
          textBox3.Text = database1DataSet.Table1.ElementAt(active_row).Adresse.ToString();
          textBox4.Text = database1DataSet.Table1.ElementAt(active_row).PLZ.ToString();
          textBox7.Text = database1DataSet.Table1.ElementAt(active_row).Ort.ToString();
    }
    Aber jetzt kommt das eigentliche Problem:
    Ich möchte das datagridview filtern damit nicht alle Elemente angezeigt werden dazu dient dieser Code der über das Textchange event der suchen_Textbox aufgerufen wird.
    private void dataset_init()  //Suchfunktion //initialisiert das Dataset 
    {
    dataGridView1.CurrentCell.Selected = false;
    DataTable db = database1DataSet.Tables["Table1"];
    DataView view = new DataView(db);
    view.RowFilter = "Firma LIKE '%" + this.textBox6.Text + "%'";
    dataGridView1.DataSource = view.ToTable();
    setDataToFields();
    }
    Im datagridview wir das dann auch richtig angezeigt allerdings sind die IDs die er mir dann zurückliefert eben auf das view bezogen die Daten für die Textboxen holt er sich aber vom databaseDataSet. Das funktioniert aber nur so lange wie kein filter gesetzt ist. Wenn ich jetzt im View Zeilen ausblende ändern sich die IDs entsprechend Bsp: Im view werden 3 Datensätze angezeigt in der Datenbank sind eigentlich 5 die ersten beiden fallen durch filter raus. Jetzt lese ich die ID der im view angewählten Zeile aus zb die 2. In die Textboxen werden dann die Daten mit der ID 2 aus der Datenbank geschrieben und das ist dann natürlich falsch.

    Ist jetzt ein bisschen wirr deswegen hab ich nochmal eine bebilderte Problembeschreibung gebaut.

    http://www.contragaming.de/datagridhilfe.jpg

    Vielen Dank für eure Hilfe!
    Donnerstag, 17. September 2009 06:40

Antworten

  • Hallo Joel,

    Dein ganzer Aufbau wird nur so kompliziert, weil Du keine Datenbindung einsetzt und zum DataGridView:
    Gewusst wie: Binden von Daten an das DataGridView-Steuerelement in Windows Forms

    Dadurch wird nicht zum einen Verwaltung der aktuellen Zeile über einen CurrencyManager
    (vorzugsweise einer BindingSource) gemanagt wie auch das übertragen der Daten in
    Steuerlemente und zurück ins DataSet.

    Und selbst wenn Du dies nicht möchtest, so solltest Du Dir die Themen anschauen,
    denn dort wird auch gezeigt, dass eine Bindung grundsätzlich mit einer DataView erfolgt.

    Das - ohnehin ineffiziente - database1DataSet.Table1.ElementAt(active_row) kann durch ein
    view["Firma"] usw. ersetzt werden. Voraussetzung ist nur, dass Du das View Objekt auf
    Formular-Ebene verfügbar machst.

    Gruß Elmar
    • Als Antwort markiert Joel Buttlar Donnerstag, 17. September 2009 17:17
    Donnerstag, 17. September 2009 07:30
    Beantworter
  • Hallo Joel,

    Du kannst die Textboxen ebenfalls mit einem Binding versehen,
    für oben in Verbindung mit der View z. B.
    textBox2.DataBindings.Add(New Binding("Text", view, "Firma"));

    Wenn Du Dir eine BindingSource für das Formular erstellt, wie es das DataGridView Beispiel
    verwendet, so kannst  Du es direkt im Formular Designer über den Eigenschaftseditor einstellen.

    Gruß Elmar


    • Bearbeitet Elmar BoyeEditor Donnerstag, 17. September 2009 16:34 Codeformatierung
    • Als Antwort markiert Joel Buttlar Donnerstag, 17. September 2009 17:17
    Donnerstag, 17. September 2009 16:32
    Beantworter

Alle Antworten

  • Hallo Joel,

    Dein ganzer Aufbau wird nur so kompliziert, weil Du keine Datenbindung einsetzt und zum DataGridView:
    Gewusst wie: Binden von Daten an das DataGridView-Steuerelement in Windows Forms

    Dadurch wird nicht zum einen Verwaltung der aktuellen Zeile über einen CurrencyManager
    (vorzugsweise einer BindingSource) gemanagt wie auch das übertragen der Daten in
    Steuerlemente und zurück ins DataSet.

    Und selbst wenn Du dies nicht möchtest, so solltest Du Dir die Themen anschauen,
    denn dort wird auch gezeigt, dass eine Bindung grundsätzlich mit einer DataView erfolgt.

    Das - ohnehin ineffiziente - database1DataSet.Table1.ElementAt(active_row) kann durch ein
    view["Firma"] usw. ersetzt werden. Voraussetzung ist nur, dass Du das View Objekt auf
    Formular-Ebene verfügbar machst.

    Gruß Elmar
    • Als Antwort markiert Joel Buttlar Donnerstag, 17. September 2009 17:17
    Donnerstag, 17. September 2009 07:30
    Beantworter
  • Vielen Dank Elmar!

    Ich habe es jetzt so relasiert wie in diesem Beispiel gezeigt (http://msdn.microsoft.com/de-de/library/fbk67b6z.aspx)

    Allerdings ist mir jetzt noch nicht klar wie ich die Daten jetzt in meine textboxen schreiben kann.

    Gruß Joel
    Donnerstag, 17. September 2009 16:10
  • Hallo Joel,

    Du kannst die Textboxen ebenfalls mit einem Binding versehen,
    für oben in Verbindung mit der View z. B.
    textBox2.DataBindings.Add(New Binding("Text", view, "Firma"));

    Wenn Du Dir eine BindingSource für das Formular erstellt, wie es das DataGridView Beispiel
    verwendet, so kannst  Du es direkt im Formular Designer über den Eigenschaftseditor einstellen.

    Gruß Elmar


    • Bearbeitet Elmar BoyeEditor Donnerstag, 17. September 2009 16:34 Codeformatierung
    • Als Antwort markiert Joel Buttlar Donnerstag, 17. September 2009 17:17
    Donnerstag, 17. September 2009 16:32
    Beantworter
  • Danke Elmar!!!

    Es funktioniert echt super! Ich wusste garnciht das die Möglichkeit mit den DataBiddings besteht.

    Hochachtungsvolle Grüße,
    Joel
    Donnerstag, 17. September 2009 17:18