Announcement

Collapse
No announcement yet.

Nach sortieren im Datagrid PK versetzt

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Nach sortieren im Datagrid PK versetzt

    Hallo
    ich benutze Delphi2005.net

    meine Daten sind an Controls gebunden die Tabelle wird in einen DataGrid angezeigt
    es wird ein CurrencyManager verwendet.
    ich kann Datensätze einfügen löschen und auch ändern
    ohne Probleme!!

    Wenn ich jetzt aber im DataGrid sortiere , geht nix mehr richtig!?
    es wird versucht ein anderen Datensatz zu ändern als gewählt usw

    ich habe zum testen eine TextBox mit meinen PK gebunden dort wird immer der richtige Schlüssel angezeigt
    lese ich jetzt über einen Button das Datagrid aus steht da was ganz anderes

    TextBox3.Text := AusfuehrungTable.Rows.Item[DataGrid3_1.CurrentRowIndex].Item['ID'].ToString;
    TextBox4.Text := AusfuehrungTable.Rows.Item[AusfuehrungCurrManager.Position].Item['ID'].ToString;

    ich habe das Gefühl das nach dem sortieren vergessen wurde den PK mit zu sortieren???????

    Weiß jemand Rat

    ps
    ich habe da gefühl das die DataTable nix mitbekommt?

  • #2
    Hallo,
    in einem Formular können beliebig viele CurrencyManager-Instanzen aktiviert werden, wobei jeder von diesen einen anderen "virtuellen Datensatzzeiger" verwendet. Wenn bei allen Datenbindungen nicht der exakt gleiche Zugriffspfad verwendet wird, verbaut .NET mehrere CurrencyManager.

    Das DataGrid ist nur die Benutzeroberfläche, die im Fall des Sortierens über einen anderen View auf die DataTable-Instanz im DataSet zugreift. Daher gilt der über <i>DataGrid3_1.CurrentRowIndex</i> ausgelesene Wert nur für das implizit aktive View, aber nicht für die DataTable-Instanz im DataSet.

    Bei dem folgenden Beispiel werden in den Textboxen unabhängig von der Sortierung immer die richtigen Werte angezeigt. Das DataGrid wird über eine explizit konfigurierte DataView-Instanz mit der DataTable verbunden:

    <div style="font-family: Courier New; font-size: 10pt; color: black; background: white; border-top: windowtext 1pt solid; padding-top: 0pt; border-left: windowtext 1pt solid; padding-left: 0pt; border-right: windowtext 1pt solid; padding-right: 0pt; border-bottom: windowtext 1pt solid; padding-bottom: 0pt;"><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">private</span> DataSet aDS = <span style="color: blue;">new</span> DataSet();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">private</span> DataView aDV = <span style="color: blue;">new</span> DataView();</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">private</span> <span style="color: blue;">void</span> Form1_Load(<span style="color: blue;">object</span> sender, System.<span style="color: teal;">EventArgs</span> e)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: green;">//neue DataTable erzeugen</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; DataTable aNewDataTable = <span style="color: blue;">new</span> DataTable();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; aNewDataTable.Columns.Add(<span style="color: maroon;">"id"</span>, <span style="color: blue;">typeof</span>(<span style="color: teal;">Int32</span>));</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; aNewDataTable.Columns.Add(<span style="color: maroon;">"Nachname"</span>, <span style="color: blue;">typeof</span>(<span style="color: teal;">String</span>));</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; aNewDataTable.Columns.Add(<span style="color: maroon;">"Vorname"</span>, <span style="color: blue;">typeof</span>(<span style="color: teal;">String</span>));</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: green;">// Primärschlüssel</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; aNewDataTable.PrimaryKey = <span style="color: blue;">new</span> DataColumn[] {aNewDataTable.Columns[0]};</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; aNewDataTable.MinimumCapacity = 10;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: green;">// Datensätze eintragen </span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; aNewDataTable.Rows.Add(<span style="color: blue;">new</span> <span style="color: teal;">Object</span>[] {1, <span style="color: maroon;">"Kosch"</span>, <span style="color: maroon;">"Andreas"</span>});</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; aNewDataTable.Rows.Add(<span style="color: blue;">new</span> <span style="color: teal;">Object</span>[] {2, <span style="color: maroon;">"Mustermann"</span>, <span style="color: maroon;">"Manfred"</span>});</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; aNewDataTable.Rows.Add(<span style="color: blue;">new</span> <span style="color: teal;">Object</span>[] {3, <span style="color: maroon;">"Ritz"</span>, <span style="color: maroon;">"Bernd"</span>});</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: green;">// Ergebnis anzeigen</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; aDS.Tables.Add(aNewDataTable);</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; aDV.Table = aDS.Tables[0];</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; dataGrid1.DataSource = aDV;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">private</span> <span style="color: blue;">void</span> button1_Click(<span style="color: blue;">object</span> sender, System.<span style="color: teal;">EventArgs</span> e)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: green;">// aktuelle Werte zur Kontrolle anzeigen</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; textBox1.Text = aDV[dataGrid1.CurrentRowIndex][0].ToString();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; textBox2.Text = aDV[dataGrid1.CurrentRowIndex][1].ToString(); </p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p></div>

    P.S: Im .NET Framework 2.0 wird DataGrid durch DataGridView abgelöst (d.h. dort kann die DataView-Komponente niemals mehr vergessen werden, weil bereits fest eingebaut

    Comment


    • #3
      Hallo
      mein Problem ist das sortieren

      vor den Sortiern des DataGrid

      sieht es so aus;

      id steht für PK

      mein DataGrid

      //************************************************** ****************************
      //DataGrid Style
      function TAusfuehrung.FDataGridStyle() : DataGridTableStyle;
      var
      TextBoxCol1 : DataGridTextBoxColumn;
      TextBoxCol2 : DataGridTextBoxColumn;
      begin
      //DataGridStyle erzeugen
      Result := System.Windows.Forms.DataGridTableStyle.Create;
      Result.MappingName := FTableName_s;
      Result.RowHeaderWidth := 25;

      //Style Farbe
      Result.AlternatingBackColor := System.Drawing.Color.LightSteelBlue;

      //TextBoxCol1
      TextBoxCol1 := DataGridTextBoxColumn.Create;
      TextBoxCol1.MappingName := 'ID';
      TextBoxCol1.HeaderText := 'ID';
      TextBoxCol1.Width := 50;
      TextBoxCol1.ReadOnly := True;

      //TextBoxCol2
      TextBoxCol2 := DataGridTextBoxColumn.Create;
      TextBoxCol2.MappingName := 'NAME';
      TextBoxCol2.HeaderText := 'Farben';
      TextBoxCol2.Width := 150;
      TextBoxCol2.ReadOnly := True;

      //Zum Style hinzufügen
      Result.GridColumnStyles.Clear;
      Result.GridColumnStyles.Add(TextBoxCol1);
      Result.GridColumnStyles.Add(TextBoxCol2);
      Result.ReadOnly := True;

      Meine Datenbindungen

      //Controls binden
      procedure FSetAusfuehrungControlsBinden();
      begin

      //TextBox30 NAME
      gfrmPreisliste.TextBox3_0.DataBindings.Clear;
      gfrmPreisliste.TextBox3_0.DataBindings.Add('Text', gfrmPreisliste.AusfuehrungTable, 'ID');

      //TextBox31 NAME
      gfrmPreisliste.TextBox3_1.DataBindings.Clear;
      gfrmPreisliste.TextBox3_1.DataBindings.Add('Text', gfrmPreisliste.AusfuehrungTable, 'NAME');

      //TextBox3_100 BESCHREIBUNG
      gfrmPreisliste.TextBox3_100.DataBindings.Clear;
      gfrmPreisliste.TextBox3_100.DataBindings.Add('Text ', gfrmPreisliste.AusfuehrungTable, 'BESCHREIBUNG');

      //Label1_101 USER_NAME
      gfrmPreisliste.Label3_101.DataBindings.Clear;
      gfrmPreisliste.Label3_101.DataBindings.Add('Text', gfrmPreisliste.AusfuehrungTable, 'USER_NAME');

      //Label1_102.Text USER_DATE
      gfrmPreisliste.Label3_102.DataBindings.Clear;
      gfrmPreisliste.Label3_102.DataBindings.Add('Text', gfrmPreisliste.AusfuehrungTable, 'USER_DATE');
      end;

      und zum testen
      TestButton
      TextBox3.Text := AusfuehrungTable.Rows.Item[DataGrid3_1.CurrentRowIndex].Item['ID'].ToString;

      wenn ich jetzt ein Datensatz im DataGrid anclicke
      seht überall für ID zb. 14
      auch im Testbutton

      soriere ich jetzt im DataGrid

      und ich klicke im DataGrid den gleichen Datensatz an

      seht in den Datenbindungen und im Datagrid 14

      aber wenn ich jetzt den Testbutton drücke steht hier was anders
      und zwar der Datensatz der hier vor den sortieren stand!!!!

      das wäre ja auch nicht schlimm
      denn wenn ich ein Update gegen die datenbank fahre wird der richtige datensatz geändert!!!!!!!!!!

      Aber ich frage bevor ich das update fahre noch DataRowState ab
      und da steht er falsch!!!

      if (gfrmPreisliste.AusfuehrungTable.Rows[gfrmPreisliste.DataGrid3_1.CurrentRowIndex].RowState = DataRowState.Modified) then

      bzw

      if (gfrmPreisliste.AusfuehrungTable.Rows[gfrmPreisliste.DataGrid3_1.CurrentRowIndex].RowState = DataRowState.Added) then

      ich mache es jetzt das ich durch eine schleife laufe und prüfe ob irgend eine Row geändert oder neu eingefügt wurde

      man kann bei mir immer nur ein Datensatz ändert

      Raimun

      Comment


      • #4
        Hallo,
        solange die <b>DataView</b>-Komponente nicht zwischen das DataSet und das DataGrid geschaltet wird, verschwindet das Problem nicht. Der Fehler liegt beim direkten Zugriff auf die DataTable-Instanz, indem der DataGrid-Index für die Position in der Rows-Kollektion der DataTable verwendet wird:

        gfrmPreisliste.AusfuehrungTable.Rows[gfrmPreisliste.DataGrid3_1.CurrentRowIndex].RowState...

        &gt;..denn wenn ich ein Update gegen die datenbank fahre wird der richtige datensatz geändert..

        Ja - denn das Problem betrifft nur die Benutzeroberfläche, da das Sortieren eine andere Sichtweise (View) aktiviert

        Comment


        • #5
          Hallo
          sie schreiben

          > .... Der Fehler liegt beim direkten Zugriff auf die DataTable-Instanz, indem der DataGrid-Index für die Position in der Rows-Kollektion der DataTable verwendet wird: ...<

          mit welchen Index soll ich den arbeiten?
          bei currManager tritt das Problem ja auch auf
          es ja auch nur der RowState der dann ja nicht mehr passt.

          Ich habe jetzt ein Problem mit Aussage "Fehler" und "Problem"

          habe ich jetzt ein Fehler gemacht oder liegt es am ADO.net?

          den RowState hole ich ja jetzt über ein schleife

          >solange die DataView-Komponente nicht zwischen das DataSet und das DataGrid<

          ich muss doch hier noch die DataTable zwischenschalten

          Dataset >>> DataTable > DataGrid > CurrManager !???

          Raimund

          Das der Datensatzzeiger nicht mehr so zur Verfügung ist schwer zu vergesse

          Comment


          • #6
            Hallo,
            &gt;...mit welchen Index soll ich den arbeiten?

            mit dem DataView-Index. Das Beispiel aus <i>http://www.entwickler-forum.de/webx?224@@[email protected]/0</i> ist standalone lauffähig

            Comment


            • #7
              Hi
              ich habe das Problem jetzt so gelöst, das bevor ich
              FObjektCurrManager.AddNew();
              aufrufe

              ein
              FObjektTable.DefaultView.Sort := 'OB_ID';

              gesetzt habe

              denn nach dem sortieren und ein einfügen wurde zwar ein datensatz eingefügt aber der Datensatz der jetzt am ende stand wurde mit den daten besetzt

              Durch ein sort ist aber jetzt alles wieder gleich - sprich datagrid und table

              leider habe ich es nicht hinbekommen das nach dem sortieren die Table es mitbekommt und der index wieder gleich ist mit dem Datagrid

              wenn einer ne andere lösung hat ......

              raimun

              Comment

              Working...
              X