Announcement

Collapse
No announcement yet.

Werte Übergabe???

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

  • Werte Übergabe???

    Vielleicht denke ich zu kompliziert...

    Ich habe ein Haupt-Form. In deisem lese ich aus einer Datenbank Daten aus - mit DOPPEL-KLICK auf einen Datensatz öffnet sich ein neues Form und in diesem Form sollen nun alle Daten des Datensatzes angezeigt werden... doch wie bekomme ich nun meine ID zum neuen Form gesendet??? In PHP nutze ich POST und GET aber wie realisiere ich es in C#

    Dank im Voraus

    MFG

    M.Bocho

  • #2
    Hallo,

    wenn der in einem Formular ausgewählte Datensatz zur Bearbeitung in einem anderen Formular angezeigt werden soll, gibt es bei einer Windows Forms-Anwendung 2 Optionen:<br>
    1. Es wird nur der Primärschlüsselwert des ausgewählten Datensatzes ermittelt, das zweite Formular liest damit die Daten neu ein <br>
    2. Es wird der im ersten Formular zuständige CurrencyManager übergeben, so dass sich das 2. Formular an den gleichen Datensatz aufschalten kann.
    <br><br>
    Das folgende Beispiel demonstriert den 2. Weg:
    <br><br>

    a) Aufruf im Hauptformular:
    <pre>
    <b>private</b> <b>void</b> button3_Click(<b>object</b> sender, System.EventArgs e)
    {
    Form2 aFrm2 = <b>new</b> Form2();
    CurrencyManager aCM;
    aCM = (CurrencyManager)BindingContext[dataSet11, <font color="#9933CC">&quot;Customers&quot;</font>];
    aFrm2.DoEditData(aCM);
    }
    </pre>
    b) Implementierung im 2. Formular:
    <pre>
    <b>public</b> <b>void</b> DoEditData(CurrencyManager aCM)
    {
    DataRowView aDRV = aCM.Current <b>as</b> DataRowView;
    DataView aDV = aDRV.DataView;
    <b>this</b>.BindingContext[aDV].Position = aCM.Position;
    textBox1.DataBindings.Add(<font color="#9933CC">&quot;Text&quot;</font>, aDV, <font color="#9933CC">&quot;CustomerID&quot;</font>);
    textBox2.DataBindings.Add(<font color="#9933CC">&quot;Text&quot;</font>, aDV, <font color="#9933CC">&quot;CompanyName&quot;</font>);
    <b>if</b> (<b>this</b>.ShowDialog() == DialogResult.OK)
    aCM.EndCurrentEdit();
    <b>else</b>
    aCM.CancelCurrentEdit();
    }
    </pre>

    Bei einer ASP.NET Web Form-Anwendung ist in der Regel nur der 1. Weg üblich. Dabei kann ein HyperLink-Control den Aufruf der 2. Web Form übernehmen. Die URL wird für jeden Datensatz bereits in der SQL-Anweisung generiert:
    <pre>
    SELECT
    x,y,z, 'DetailForm.aspx?id=' + pk_wert AS DetailLink
    FROM
    Tabelle
    </pre&gt

    Comment


    • #3
      Hallo Andreas Kosch,

      so, wie Du die 1.Möglichkeit beschrieben hast wollte ich es realisieren. Aber leider habe ich nicht verstanden, wie ich nun den Wert des Primär-Schlüssels zum 2.Form bekomme... kann sein das ich zu kompliziert denke...
      MFG
      Marc Boch

      Comment


      • #4
        Hallo,

        da ADO.NET (genauer gesagt die DataSet-Klasse) mengenorientiert arbeitet, gibt es keinen Datensatzzeiger (ein Formular kann in seinen Controls mehrere Datensätze gleichzeitig anzeigen). Daher muss ein <b>CurrencyManager</b> eine virtuelle Datensatzposition simulieren, wobei es in einem Form mehrere CurrencyManager (je nach angebundenen Controls) geben kann.

        Wenn nun ein DataGrid oder eine TextBox an ein typisiertes DataSet gebunden wurde, kann man über den folgenden Weg den aktuellen Primärschlüsselwert des "virtuellen Datensatzzeigers" auslesen:
        <pre>
        <b>private</b> CurrencyManager aCM;
        ...
        aCM = (CurrencyManager)BindingContext[dataGridAutor.DataSource, dataGridAutor.DataMember];
        iAdrId = (<b>int</b>)dataSetAutor1.Adressen.Rows[aCM.Position][<font color="#9933CC">&quot;AdrID&quot;</font>];
        </pre>
        Wenn die Controls nicht direkt an ein DataSet, sondern an ein <B>DataView</b> gebunden werden, kann man auch folgendes machen:
        <pre>
        System.Data.DataRow aDR = dataViewAbos[dataGridAbos.CurrentRowIndex].Row;
        <b>int</b> iAutorAboID = (<b>int</b>)aDR[0];
        </pre>
        Wenn in meinem Beispiel dann der Integer-Wert des Primärschlüssels feststeht, kann dieser an das 2. Form übergeben werden: <br>
        a) überladener Constructor, oder <br>
        b) öffentliche Methode, die dann auch gleich mit Hilfe des Primärschlüsselwerts den vollständigen Datensatz neu einläd

        Comment


        • #5
          Hallo Andreas Kosch, ich glaube ich habe mich nicht so richtig ausgedrückt.
          Als den Datensatz ermitteln usw. ist kein Problem. Mein Problem ist wie frage ich jetzt im zweitem FORM meinen Wert ab...<br />
          <---FORM 1 ---><br />
          //Show Adress DLG<br />
          private void Show_Adress_Click(object ender, System.EventArgs e)<br />
          {
          string strAID = this.listView1.electedItems[0].Text.ToString();

          System.Windows.Forms.Form Form_Show_AdressDlg=new Form_Show_Adress();
          Form_Show_AdressDlg.Icon=this.Icon;
          Form_Show_AdressDlg.ShowDialog();

          }<br />
          Also das ist meine Anweisung für den DOPPELKLICK... und wie geht es dann weiter
          Ich denke mir mal das ich jetzt irgendwo mein STRING mit übermitteln muß und in FORM 2 diesen STRING nur auslesenbrauch und in meine SQL-Anweisung einbinden... nur wie lese ich in FORM 2 meinen String bzw. wie bekomme ich den Wert dahin...<br />
          <--- FORM 2 ---><br />
          .
          .
          .
          try
          {
          myConnection.Open();
          string strSelect = "SELECT * FROM adressen WHERE aid='"+strAID+"'";
          OdbcCommand myDataCommand = new OdbcCommand (strSelect, myConnection);
          OdbcDataReader myDataReader = myDataCommand.ExecuteReader();
          .
          .
          .
          <br />
          Dank nochmal für die Mühe...
          <br />
          MFG
          Marc Boch

          Comment


          • #6
            mach doch einfach ne Methode und ne Variable in Form_Show_Adress. Die Methode rufst du auf um den Dialog zu öffnen und die Daten zu aktualisieren.

            Form2:

            <PRE>
            private string _PrimID;

            public string PrimID
            {
            get { return _PrimID; }
            set { _PrimID = value; }
            }

            public void DoEditData()
            {
            GetData();
            if (this.ShowDialog() == DialogResult.OK)
            //SaveData;
            else
            //Exit without SaveData;
            }
            </PRE>

            Aufruf dann aus Form1:

            <PRE>
            private void button3_Click(object sender, System.EventArgs e)
            {
            Form2 aFrm2 = new Form2();
            aFrm2.PrimID = "xyz";
            aFrm2.DoEditData();
            }</PRE>

            PS: Dennoch finde ich die 2. Methode von Herrn Kosch besser. So wird nicht nochmal der Server beauftragt Daten zu schicke

            Comment


            • #7
              Vielen Dank an alle, für die Unterstüzung...
              Jetzt wo ich die "ZWEITE - Methode" von Herrn Kosch verstanden habe ist mal wieder alles sehr einfach...
              Nochmals vielen Dank...

              MFG

              Marc Boch

              Comment

              Working...
              X