Announcement

Collapse
No announcement yet.

databinding child? parent? table per relation

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

  • databinding child? parent? table per relation

    so ich hab ein großes vll auch nur kleines problem
    hab mit dem dataset designer 2 tabellen angelegt

    B_S_Fahrzeuge
    FahrzeugID
    kennung
    ...
    B_S_Z_Firma_Fahrzeuge
    FahrzeugID
    ....

    verknüpft mit einer relation
    "B_S_Z_Firma_Fahrzeuge_B_S_Fahrzeuge"




    als dialog hab ich ein true DBGRID von componentone wo ich die B_S_Z reinlade und darin navigieren kann
    je nachdem welcher datensatz ausgewählt wird
    sollte in einem textfeld die Kennung von B_S_Fahrzeuge auftauchen, per databinding

    ich habe nun schon so viele variatnen mti den relationen und databinding versucht dass ich jetzt um hilfe bittte weil ich einfach auf keinen grünen zweit komme der code dafür ist folgender

    Code:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Data.SqlClient;
    using BusStammdaten.DataSets;
    
    
    namespace RBP.Bus
    {
        public partial class FahrzeugZuordnung : Form
        {
            private ds_FahrzeugZuordnung ds_FahrzeugZ;
            private SqlDataAdapter sqlDA_FahrzeugZ;
            private SqlDataAdapter sqlDA_Firmen;
            private SqlDataAdapter sqlDA_Fahrzeuge;
            private SqlConnection sqlConn;
    
    
            public FahrzeugZuordnung()
            {
                InitializeSqlDA();
                InitializeComponent();
                InitializeComps();
                DataBinding(true);
            }
    
            private void InitializeSqlDA()
            {
                ds_FahrzeugZ = new ds_FahrzeugZuordnung();
                sqlConn = RBP.Global.SystemConf.GetConnection();
                
                //dataset befüllen
                sqlDA_Firmen = new SqlDataAdapter("select * from A_S_Firmen", sqlConn);
                sqlDA_Firmen.Fill(ds_FahrzeugZ.A_S_Firmen);
    
                sqlDA_Fahrzeuge = new SqlDataAdapter("select * from B_S_Fahrzeuge", sqlConn);
                sqlDA_Fahrzeuge.Fill(ds_FahrzeugZ.B_S_Fahrzeuge);
                
                sqlDA_FahrzeugZ = new SqlDataAdapter("select * from B_S_Z_Firma_Fahrzeuge", sqlConn);
                sqlDA_FahrzeugZ.Fill(ds_FahrzeugZ.B_S_Z_Firma_Fahrzeuge);
    
     
            }
    
            private void InitializeComps()
            {
                            
                //firmen combobox datasource setzen
                cbx_Firma.Properties.DataSource = ds_FahrzeugZ.A_S_Firmen;
                cbx_Firma.Properties.DisplayMember = "Name";
                cbx_Firma.Properties.ValueMember = "FirmenID";
    
                dbg_FahrzeugZuordnung.RowColChange +=new C1.Win.C1TrueDBGrid.RowColChangeEventHandler(check);
            }
            private void DataBinding(Boolean bActive)
            {
                if (bActive)
                {
                    dbg_FahrzeugZuordnung.SetDataBinding(ds_FahrzeugZ.B_S_Z_Firma_Fahrzeuge, "", true);
                    cbx_Firma.DataBindings.Add("EditValue", ds_FahrzeugZ.B_S_Z_Firma_Fahrzeuge, "FirmenID");
    
                    txt_Fahrzeug.DataBindings.Add("EditValue", ds_FahrzeugZ.B_S_Z_Firma_Fahrzeuge, "B_S_Z_Firma_Fahrzeuge_B_S_Fahrzeuge.B_S_Fahrzeuge.Kennung");
                    
    txt_Kennzeichen.DataBindings.Add("EditValue", ds_FahrzeugZ.B_S_Z_Firma_Fahrzeuge, "Kennzeichen");
                    txt_Von.DataBindings.Add("EditValue", ds_FahrzeugZ.B_S_Z_Firma_Fahrzeuge, "Von");
                    txt_Bis.DataBindings.Add("EditValue", ds_FahrzeugZ.B_S_Z_Firma_Fahrzeuge, "Bis");
                }
            }
    
            private void check(object sender,EventArgs args)
            {
            }
    
            
        }
    }
    die nun oben fettmarkierte zeile

    txt_Fahrzeug.DataBindings.Add("EditValue", ds_FahrzeugZ.B_S_Z_Firma_Fahrzeuge, "B_S_Z_Firma_Fahrzeuge_B_S_Fahrzeuge.B_S_Fahrzeuge .Kennung");

    ist die magische zeile. Ich habe nun den letzen stand meiner kläglich gescheiterten versuche drinnen stehen lassen.
    ich hoffe mir kann jemand helfen

    mfg
    Trigonic

  • #2
    Hallo,

    das Problem dürfte darin liegen, dass ein Dataset ungeordnete Datenmengen enthält. Ein Datagrid enthält selbst Möglichkeiten zum Navigieren, aber das reine DataBinding in einem anderen Control nicht. Du musst also für die Synchronisation der Anzeige sorgen.

    Einen Lösungsvorschlag habe ich nicht; mit solchen Details habe ich mich noch nicht befasst. Ich glaube aber, dass Andreas Kosch in den letzten vier Wochen einmal auf dieses Thema eingegangen ist. Durchsuche einmal seine Beiträge (nicht nur in diesem Unterforum) nach den Stichworten DataBinding, BindingManagerBase, CurrencyManager; da solltest Du fündig werden.

    Viel Erfolg! Jürgen

    PS. Übrigens vermisse ich in Deinem Beitrag einen ausdrücklichen Hinweis darauf, was eigentlich nicht klappt.
    Zuletzt editiert von Jürgen Thomas; 14.04.2007, 10:07. Reason: PS

    Comment


    • #3
      danke mal für diie infos und jo funktionieren tut nicht dass im textfeld eben dieser wert der ausgewälten zeile im datagrid angezeigt wird aus dem child table

      Comment


      • #4
        Hallo,

        wenn der DataSet-Designer von Visual Studio 2005 die Beziehungen zwischen den beiden Tablelen durch die Verbindungslinie anzeigt, stellt auch das Data Sources-Fenster von Visual Studio die Abhängigkeit durch die eingerückte Darstellung (siehe Abbildung) an. Wenn die eingerückt dargestellte DataTable (d.h. anstelle der DataTable die DataRelation-Instanz) als Datenquelle für die Datenbindung verwendet wird, synchronisiert ADO.NET die Detail-Anzeige automatisch für den aktuell ausgewählten Master-Datensatz.

        Wenn der Komfort der visuellen Konfiguration der Datenbindung über die Designer von Visual Studio 2005 nicht genutzt werden soll, muss im Quelltext bei der Datenbindung der Detail-Controls die Instanz der DataRelation als Datenquelle angegeben werden, aber nicht der Instanzname der DataTable, wenn die Synchronisation zum Master-Datensatz automatisch ablaufen soll.
        Attached Files

        Comment


        • #5
          ok, danke, aber wie mache ich konkret in diesem fall ein databinding?

          codezeile? weil ich habe schon so vieles versucht mit get parenttable und getchildtable nur die liefern entweder alles oder keinen datensatz
          bzw

          wenn ich das childrowobjekt des mastertablerow-objekts aufrufe da ist der richtige datensatz drinnen nur den kann ich net angeben beim databinding

          Comment


          • #6
            Hallo,

            codezeile?
            man muss im Quelltext nur das nachbauen, was der Designer von Visual Studio 2005 vormacht. Die Controls werden nicht direkt an die Datenquelle gebunden, sondern an eine dazwischengeschaltete BindingSource-Komponente. Bei dem folgenden Beispiel ist "Verfahren" der Name der Master-DataTable im DataSet und "FK__Inhaltsve__verfa__0CBAE877" der Name der DataRelation zwischen den beiden Tabellen. Die wichtigen Stellen hebe ich durch die rote Textfarbe hervor:

            Code:
            // 
            // Master-Datenquelle: verfahrenBindingSource
            // 
            this.verfahrenBindingSource.DataMember = "Verfahren";
            this.verfahrenBindingSource.DataSource = this.dataSet2;
            
            ...
            
            // 
            // Detail-Datenquelle: inhaltsverzeichnisBindingSource
            // 
            this.inhaltsverzeichnisBindingSource.DataMember = "FK__Inhaltsve__verfa__0CBAE877";
            this.inhaltsverzeichnisBindingSource.DataSource = this.verfahrenBindingSource;

            Comment


            • #7
              so i tried now a very simple version of my problem and it doesnt work


              Code:
                  {
                      private SqlConnection sqlConn;
                      private SqlDataAdapter sqlDAOrders;
                      private SqlDataAdapter sqlDAKunden;
              
                      public Form1()
                      {
                          try
                          {
                              InitializeComponent();
                              string connectstr = "Persist Security Info=True;Initial Catalog=Test_Dev;Data Source=localhost" +
                                      ";Connect Timeout=180;User ID=sa;Password=tac;";
                              sqlConn = new SqlConnection(connectstr);
                              sqlConn.Open();
              
                              sqlDAKunden = new SqlDataAdapter("select * from Kunden", sqlConn);
                              sqlDAKunden.Fill(orders.Kunden);
                              sqlDAOrders = new SqlDataAdapter("select * from Orders", sqlConn);
                              sqlDAOrders.Fill(orders.Orders);
              
                              dbg_kunden.SetDataBinding(orders, "Kunden", true);
                              dbg_orders.SetDataBinding(orders, "Kunden_Orders.Orders", true);
                          }
                          catch (Exception e)
                          {
                              string em = e.Message;
                          }
              jetzt ist das problem dass im unteren grid die daten dann net für den kunden
              angezeigt werden, aber die relation funktioniert weil wenn ich ein datalayout hierarchical auswähle für das obere (siehe bild work) dann werden die orders richtig zugeordnet, also muss es irgendwas am aktualisieren des databindgs haben ka was und wo. vll kann mir wer helfen
              Attached Files

              Comment

              Working...
              X