Announcement

Collapse
No announcement yet.

DataGrid Sortierproblem

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

  • DataGrid Sortierproblem

    Ich fülle einen Datagrid (WinForm) mit Daten aus einer Tabelle. Hier gibt es auch einen Primärschlüssel und unter anderen ein Datumsfeld.
    Nun wird die Sortierung im Datagrid geändert auf das Datumsfeld.
    Ändere ich jetzt im Datagrid den Wert eines Datums verändert sich „natürlich“ auch seine Position im Grid.
    Der Primärschlüssel wird auch an der neuen Position angezeigt, allerdings bleibt er auch an der alten Position erhalten. So das ich den Schlüssel jetzt doppelt im Grid habe, mit all den Problemen die das nach sich zieht.

    Mit welchen Mitteln kann ich dieses Problem lösen?

    Schon mal vielen Dank

    Torsten Zorn

    PS: Kleine Frage nebenbei. Die Einstellung „Datagrid.AllowSorting = false“ bleibt bei mir wirkungslos. Dh. Die Daten werden im Grid trotzdem neu sortiert, wenn ich auf den Spaltenkopf klicke??

  • #2
    Hallo,

    >So das ich den Schlüssel jetzt doppelt im Grid habe..

    was ist damit gemeint? Eine Änderung der Sortierreihenfolge (Benutzeroberfläche) verändert doch nicht den Inhalt der DataTable-Instanz im DataSet. Statt dessen wird doch nur (via DataView) beim Auslesen die Reihenfolge der Datensätze aus der mengenorientierten DataTable-Instanz verändert.

    Wie sieht ein Minimal-Beispiel aus, mit dem dieser Effekt reproduzierbar ist

    Comment


    • #3
      Hallo Herr Kosch,

      Danke für Ihre Antwort.
      Ich versuche mal ein Beispiel hinzubekommen.
      Das kann aber ein paar Tage dauern.

      Torsten Zor

      Comment


      • #4
        Hier nun ein Beispiel.
        Sortiert man im Grid die Daten nach Datum und versucht dann ein Datum zu ändern, so dass die Zeile neu einsortiert wird, kommt der Fehler.
        Der „Haken“ liegt in der letzten Programmzeile. So weit hat mir das Bsp. schon genützt.
        Im „wirklichen“ Programm stellt panel1 einen Navigator dar, der dann über die Ereignisse von panel1.DataBindings["Tag"].BindingManagerBase reagiert.

        using System;
        using System.Drawing;
        using System.Collections;
        using System.ComponentModel;
        using System.Windows.Forms;
        using System.Data;

        namespace BspGrd
        {
        /// <summary>
        /// Zusammenfassung für Form1.
        /// </summary>
        public class Form1 : System.Windows.Forms.Form
        {
        private System.Windows.Forms.DataGrid dataGrid1;
        private System.Windows.Forms.Button button1;
        private System.Windows.Forms.Panel panel1;
        /// <summary>
        /// Erforderliche Designervariable.
        /// </summary>
        private System.ComponentModel.Container components = null;

        public Form1()
        {
        //
        // Erforderlich für die Windows Form-Designerunterstützung
        //
        InitializeComponent();

        //
        // TODO: Fügen Sie den Konstruktorcode nach dem Aufruf von InitializeComponent hinzu
        //
        }
        private DataSet myDataSet;

        /// <summary>
        /// Die verwendeten Ressourcen bereinigen.
        /// </summary>
        protected override void Dispose( bool disposing )
        {
        if( disposing )
        {
        if (components != null)
        {
        components.Dispose();
        }
        }
        base.Dispose( disposing );
        }

        #region Vom Windows Form-Designer generierter Code
        /// <summary>
        /// Erforderliche Methode für die Designerunterstützung.
        /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
        /// </summary>
        private void InitializeComponent()
        {
        this.dataGrid1 = new System.Windows.Forms.DataGrid();
        this.button1 = new System.Windows.Forms.Button();
        this.panel1 = new System.Windows.Forms.Panel();
        ((System.ComponentModel.ISupportInitialize)(this.d ataGrid1)).BeginInit();
        this.SuspendLayout();
        //
        // dataGrid1
        //
        this.dataGrid1.DataMember = "";
        this.dataGrid1.HeaderForeColor = System.Drawing.SystemColors.ControlText;
        this.dataGrid1.Location = new System.Drawing.Point(16, 16);
        this.dataGrid1.Name = "dataGrid1";
        this.dataGrid1.Size = new System.Drawing.Size(344, 320);
        this.dataGrid1.TabIndex = 0;
        //
        // button1
        //
        this.button1.Location = new System.Drawing.Point(440, 56);
        this.button1.Name = "button1";
        this.button1.Size = new System.Drawing.Size(144, 32);
        this.button1.TabIndex = 1;
        this.button1.Text = "Daten anlegen";
        this.button1.Click += new System.EventHandler(this.button1_Click);
        //
        // panel1
        //
        this.panel1.Location = new System.Drawing.Point(360, 192);
        this.panel1.Name = "panel1";
        this.panel1.TabIndex = 2;
        //
        // Form1
        //
        this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
        this.ClientSize = new System.Drawing.Size(664, 373);
        this.Controls.Add(this.panel1);
        this.Controls.Add(this.button1);
        this.Controls.Add(this.dataGrid1);
        this.Name = "Form1";
        this.Text = "Form1";
        ((System.ComponentModel.ISupportInitialize)(this.d ataGrid1)).EndInit();
        this.ResumeLayout(false);

        }
        #endregion

        /// <summary>
        /// Der Haupteinstiegspunkt für die Anwendung.
        /// </summary>
        [STAThread]
        static void Main()
        {
        Application.Run(new Form1());
        }

        private void button1_Click(object sender, System.EventArgs e)
        {


        DataTable myDataTable = new DataTable("Sorttest");

        DataColumn myDataColumn;
        DataRow myDataRow;

        myDataColumn = new DataColumn();
        myDataColumn.DataType = System.Type.GetType("System.Guid");
        myDataColumn.ColumnName = "ID";
        myDataColumn.Unique = true;
        myDataColumn.AllowDBNull = false;
        myDataTable.Columns.Add(myDataColumn);

        myDataColumn = new DataColumn();
        myDataColumn.DataType = System.Type.GetType("System.DateTime");
        myDataColumn.ColumnName = "Datum";
        myDataTable.Columns.Add(myDataColumn);

        DataColumn[] PrimaryKeyColumns = new DataColumn[1] ;
        PrimaryKeyColumns[0]= myDataTable.Columns["ID"];
        myDataTable.PrimaryKey = PrimaryKeyColumns;

        for (int i =0;i<5;++i)
        {
        myDataRow = myDataTable.NewRow();
        myDataRow["ID"] = Guid.NewGuid();
        myDataRow["Datum"] = DateTime.Today.AddDays(-i) ;
        myDataTable.Rows.Add(myDataRow);
        }

        myDataSet = new DataSet();
        myDataSet.Tables.Add(myDataTable);

        DataView DataView1 = new DataView(myDataSet.Tables["Sorttest"]);
        DataView1.AllowNew = false;

        dataGrid1.DataSource = DataView1;

        panel1.DataBindings.Add("Tag", DataView1, "ID");
        }
        }

        Comment


        • #5
          Hier nun ein Beispiel.
          Sortiert man im Grid die Daten nach Datum und versucht dann ein Datum zu ändern, so dass die Zeile neu einsortiert wird, kommt der Fehler.
          Der „Haken“ liegt in der letzten Programmzeile. So weit hat mir das Bsp. schon genützt.
          Im „wirklichen“ Programm stellt panel1 einen Navigator dar, der dann über die Ereignisse von panel1.DataBindings["Tag"].BindingManagerBase reagiert.

          <PRE>
          using System;
          using System.Drawing;
          using System.Collections;
          using System.ComponentModel;
          using System.Windows.Forms;
          using System.Data;

          namespace BspGrd
          {
          /// <summary>
          /// Zusammenfassung für Form1.
          /// </summary>
          public class Form1 : System.Windows.Forms.Form
          {
          private System.Windows.Forms.DataGrid dataGrid1;
          private System.Windows.Forms.Button button1;
          private System.Windows.Forms.Panel panel1;
          /// <summary>
          /// Erforderliche Designervariable.
          /// </summary>
          private System.ComponentModel.Container components = null;

          public Form1()
          {
          //
          // Erforderlich für die Windows Form-Designerunterstützung
          //
          InitializeComponent();

          //
          // TODO: Fügen Sie den Konstruktorcode nach dem Aufruf von InitializeComponent hinzu
          //
          }
          private DataSet myDataSet;

          /// <summary>
          /// Die verwendeten Ressourcen bereinigen.
          /// </summary>
          protected override void Dispose( bool disposing )
          {
          if( disposing )
          {
          if (components != null)
          {
          components.Dispose();
          }
          }
          base.Dispose( disposing );
          }

          #region Vom Windows Form-Designer generierter Code
          /// <summary>
          /// Erforderliche Methode für die Designerunterstützung.
          /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
          /// </summary>
          private void InitializeComponent()
          {
          this.dataGrid1 = new System.Windows.Forms.DataGrid();
          this.button1 = new System.Windows.Forms.Button();
          this.panel1 = new System.Windows.Forms.Panel();
          ((System.ComponentModel.ISupportInitialize)(this.d ataGrid1)).BeginInit();
          this.SuspendLayout();
          //
          // dataGrid1
          //
          this.dataGrid1.DataMember = "";
          this.dataGrid1.HeaderForeColor = System.Drawing.SystemColors.ControlText;
          this.dataGrid1.Location = new System.Drawing.Point(16, 16);
          this.dataGrid1.Name = "dataGrid1";
          this.dataGrid1.Size = new System.Drawing.Size(344, 320);
          this.dataGrid1.TabIndex = 0;
          //
          // button1
          //
          this.button1.Location = new System.Drawing.Point(440, 56);
          this.button1.Name = "button1";
          this.button1.Size = new System.Drawing.Size(144, 32);
          this.button1.TabIndex = 1;
          this.button1.Text = "Daten anlegen";
          this.button1.Click += new System.EventHandler(this.button1_Click);
          //
          // panel1
          //
          this.panel1.Location = new System.Drawing.Point(360, 192);
          this.panel1.Name = "panel1";
          this.panel1.TabIndex = 2;
          //
          // Form1
          //
          this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
          this.ClientSize = new System.Drawing.Size(664, 373);
          this.Controls.Add(this.panel1);
          this.Controls.Add(this.button1);
          this.Controls.Add(this.dataGrid1);
          this.Name = "Form1";
          this.Text = "Form1";
          ((System.ComponentModel.ISupportInitialize)(this.d ataGrid1)).EndInit();
          this.ResumeLayout(false);

          }
          #endregion

          /// <summary>
          /// Der Haupteinstiegspunkt für die Anwendung.
          /// </summary>
          [STAThread]
          static void Main()
          {
          Application.Run(new Form1());
          }

          private void button1_Click(object sender, System.EventArgs e)
          {


          DataTable myDataTable = new DataTable("Sorttest");

          DataColumn myDataColumn;
          DataRow myDataRow;

          myDataColumn = new DataColumn();
          myDataColumn.DataType = System.Type.GetType("System.Guid");
          myDataColumn.ColumnName = "ID";
          myDataColumn.Unique = true;
          myDataColumn.AllowDBNull = false;
          myDataTable.Columns.Add(myDataColumn);

          myDataColumn = new DataColumn();
          myDataColumn.DataType = System.Type.GetType("System.DateTime");
          myDataColumn.ColumnName = "Datum";
          myDataTable.Columns.Add(myDataColumn);

          DataColumn[] PrimaryKeyColumns = new DataColumn[1] ;
          PrimaryKeyColumns[0]= myDataTable.Columns["ID"];
          myDataTable.PrimaryKey = PrimaryKeyColumns;

          for (int i =0;i<5;++i)
          {
          myDataRow = myDataTable.NewRow();
          myDataRow["ID"] = Guid.NewGuid();
          myDataRow["Datum"] = DateTime.Today.AddDays(-i) ;
          myDataTable.Rows.Add(myDataRow);
          }

          myDataSet = new DataSet();
          myDataSet.Tables.Add(myDataTable);

          DataView DataView1 = new DataView(myDataSet.Tables["Sorttest"]);
          DataView1.AllowNew = false;

          dataGrid1.DataSource = DataView1;

          panel1.DataBindings.Add("Tag", DataView1, "ID");
          }
          }
          }

          </PRE&gt

          Comment


          • #6
            Hallo,

            das ist in der Tat ein netter Effekt ;-)

            Wird alternativ eine TextBox an die Spalte "ID" gebunden, verhält sich alles normal.
            <pre>
            textBox1.DataBindings.Add("Text", DataView1, "ID");
            //panel1.DataBindings.Add("Tag", DataView1, "ID");
            </pre&gt

            Comment


            • #7
              Hallo Herr Kosch,

              danke für Ihren Tip. Der Unterschied liegt wohl in der "Tag" bzw. "Text"-Eigenschaft.
              Eine nicht-sichtbare TextBox mitzuschleppen ist zwar nicht elegant, aber es funktioniert

              Comment


              • #8
                Hallo,

                &gt;Eine nicht-sichtbare TextBox mitzuschleppen ...

                wenn diese Info für den Anwender nicht sichtbar sein soll, warum wird dann das Control überhaupt via DataBindings eingebunden? Wenn es nur darum geht, den "virtuellen Datensatzzeiger" des zur Zeit ausgewählten Datensatzes zu ermitteln, kann doch direkt der zuständige CurrencyManager abgefragt werden

                Comment


                • #9
                  Stimmt,

                  dieser einfachere Weg hat erstmal bei mir nicht geklappt, darum habe ich's anders versucht.
                  Nun habe ich es auch mit dem CurrencyManager hinbekommen.
                  Danke noch mal für die Antworte

                  Comment

                  Working...
                  X