Announcement

Collapse
No announcement yet.

CurrencyManager - er tut nicht

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

  • CurrencyManager - er tut nicht

    Hallo,

    ich habe einfach keinen Erfolg bei einer Datensatzänderung im Datagrid das PositionChanged - Ereignis des CurrencyManagers zu bekommen.

    Folgender Code:

    datset_Gemische.EnforceConstraints = false;
    cmGemische = (CurrencyManager)this.BindingContext[dataGridGemische.DataSource, dataGridGemische.DataMember];
    cmGemische.PositionChanged+=new EventHandler(cmGemische_PositionChanged);
    this.dS_Stoffdatenbank_Gemische.Clear();
    DataSet ds = ll.SelectStoffdaten(user.SessionID, user.StammDatenbank, sdin, ref fehler);
    if (ds == null) {return;}
    this.dS_Stoffdatenbank_Gemische.Merge(ds);
    // hier wird das Ereignis noch gefeuert !!!!

    Wenn ich nun im Datagrid mit der Maus eine andere Zeile anklicke, wird das Ereignis PositionChanged nicht ausgelöst!!

    Hat jemand eine Idee??

  • #2
    Hi

    Kannst du bitte bissl mehr Code posten. Ich kann im Moment daran noch nicht genau erkennen wo der Fehler sein könnte.

    Comment


    • #3
      Hallo,
      vielmehr Code ist gar nicht zu posten. Ich habe ein typisiertes Dataset erzeugt, dem Grid im Designer Datasource und Datamember visuell zugewiesen. Ausserdem liegen noch ein paar Textboxen herum, bei denen die ich ebenfalls visuell die Databindings auf das Dataset gelegt habe.
      Wenn ich im Grid einen anderen Datensatz auswähle, werden die Textboxen richtig mitgeführt. Allerdings muss ich ein paar andere Controls steuern, wenn sich die Satzposition ändert - daher der CurrencyManager.

      Die Bediernerführung ist folgende:

      - Der Anwender wählt die relevante die Registerseite aus.
      - Dann wird der unten aufgeführte code abgearbeitet.
      - Danach kann ich in Grid hin- und herklicken, mein PositionChanged-Ereignis tritt einfach nicht mehr auf.

      Hier der komplette Code-Abschnitt.

      private void tabControlStoffe_SelectedIndexChanged_1(object sender, System.EventArgs e)
      {
      if (this.tabControlStoffe.SelectedTab == this.tabPagegemische)
      {
      if (this.dS_Stoffdatenbank_Gemische.Gemischdaten.Rows .Count == 0)
      {
      Cursor hc = this.Cursor;
      this.Cursor = System.Windows.Forms.Cursors.WaitCursor;
      StoffdatenAnfrage sdin;
      sdin.SuchBegriff = "";
      sdin.SuchTyp = TIS.DISMA.CS_Allgemein.enum_StoffSuchTyp.NachGemis ch;
      sdin.filtertyp = TIS.DISMA.CS_Allgemein.enum_StoffFilterTyp.OhneFil ter;
      sdin.SuchOptionen = enum_StoffNameSuchOptionen.UebereinstimmungTeilzei chenkette;
      Fehler fehler = new Fehler();
      try
      {
      IStoffdaten ll = (IStoffdaten) remoteHelper.Create(typeof(IStoffdaten));
      if (ll != null)
      {
      this.dS_Stoffdatenbank_Gemische.EnforceConstraints = false;
      cmGemische = (CurrencyManager)this.BindingContext[dataGridGemische.DataSource, dataGridGemische.DataMember];
      cmGemische.PositionChanged+=new EventHandler(cmGemische_PositionChanged);
      this.dS_Stoffdatenbank_Gemische.Clear();
      DataSet ds = ll.SelectStoffdaten(user.SessionID, user.StammDatenbank, sdin, ref fehler);
      if (ds == null) {return;}
      this.dS_Stoffdatenbank_Gemische.Merge(ds);
      this.setzeStatus(this.dS_Stoffdatenbank_Gemische.G emischdaten.Rows.Count);
      this.ResumeLayout();
      }
      }
      catch(Exception ex)
      {
      System.Windows.Forms.MessageBox.Show(ex.Message);
      }
      finally
      {
      this.Cursor = hc;
      }
      }
      }
      }

      eine Idee

      Comment


      • #4
        Hallo,

        ich kann das Problem nicht reproduzieren. Meine Testanwendung sieht dabei wie folgt aus:
        <br>
        a) Datenbank tempdb vom MS SQL Server 2000
        <code>
        USE tempdb
        GO
        CREATE TABLE TestTbl
        (
        recid INTEGER NOT NULL IDENTITY PRIMARY KEY,
        wert NVARCHAR(9) NOT NULL,
        datum DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
        )
        GO
        INSERT INTO TestTbl (wert) VALUES ('Wert 1');
        INSERT INTO TestTbl (wert) VALUES ('Wert 2');
        INSERT INTO TestTbl (wert) VALUES ('Wert 3');
        GO
        </code>
        b) Windows Forms-Anwendung
        <br>
        DataGrid wird über eine DataView-Komponente an das typisiertes DataSet gebunden.
        <code>
        <b>private</b> CurrencyManager aCM;
        <br>
        <b>private</b> <b>void</b> Form1_Load(<b>object</b> sender, System.EventArgs e)
        {
        sqlDataAdapter1.Fill(dataSet11, dataSet11.TestTbl.TableName);
        aCM = (CurrencyManager)<b>this</b>.BindingContext[dataView1];
        aCM.PositionChanged += <b>new</b> EventHandler(aCM_PositionChanged);
        }
        <br>
        <b>private</b> <b>void</b> aCM_PositionChanged(<b>object</b> sender, EventArgs e)
        {
        statusBar1.Text = <b>String</b>.Format(<font color="#9933CC">&quot;Datensatz {0} von {1}&quot;</font>,
        (aCM.Position + 1).ToString(), aCM.Count.ToString());
        }
        <br>
        <b>private</b> <b>void</b> buttonMerge_Click(<b>object</b> sender, System.EventArgs e)
        {
        <font color="#003399"><i>// Query Anlalyzer: UPDATE dbo.TestTbl SET wert = 'Wert 2neu' WHERE recid = 2</i></font>
        DataSet aTmpDS = <b>new</b> DataSet();
        sqlDataAdapter1.Fill(aTmpDS, dataSet11.TestTbl.TableName);
        MessageBox.Show(<b>String</b>.Format(<font color="#9933CC">&quot;{0} Datensätze geladen.&quot;</font>,
        aTmpDS.Tables[0].Rows.Count));
        dataSet11.Merge(aTmpDS);
        }
        </code>
        c) Verhalten zur Laufzeit: Auch nach dem Merge-Aufruf aktualisiert sich die Statuszeile. Zur Kontrolle wurde dabei nach dem Starten und vor dem Anklicken des Merge-Buttons der Inhalt des zweiten Datensatzes in der Tabelle durch eine UPDATE-Anweisung geändert. Der neue Wert ist nach dem Merge-Aufruf im DataGrid sichtbar

        Comment

        Working...
        X