Tabellenbeziehungen

Sword

Mitglied
Hallo,

ich habe eine C# Projekt in dem aus einer Access Datenbank zwei Tabellen benötigt werden. Diese beiden Tabellen sind mit jeweils einem DataGridView in die Form eingebunden und zeigen auch die benötigten Daten an.

In jeder dieser Tabellen ist ein Primärschlüssel vorhanden.

Jetzt möchte ich in Tabelle1 einen Wert im DataGridView1 auswählen und der zugehörige Wert aus Tabelle2 soll sofort im DataGridView2 angezeigt werden.

Allerdings reagiert das DataGridView2 überhaupt nicht, obwohl ich meiner Meinung nach die Beziehungen im DataSet richtig angelegt habe.

Was muss noch gemacht werden?

Vielen Dank

PS.: Ich bin absoluter Neuling in Sachen C# und Datenbanken.
 
Da wir keinen Code haben wo wir Fehler auschließen können, vermute ich einfach das du den neuen Select Befehl nicht ausführst. Das zweite DataGridView weiß ja gar nicht was es mit den Daten aus dem ersten View anstellen soll. Wie gesagt reine Vermutung ohne Code ;)
 
Hallo,

mein derzeitiger Code:

Code:
private void changeCellDataGridView1(object sender, EventArgs e)
        {
            string change_DataGridView2;
            DataGridView myDataGrid;
            myDataGrid = (DataGridView)sender;
            change_DataGridView2 = Convert.ToString(myDataGrid.ColumnCount);
            textBox1.Text = change_DataGridView2;
        }

In wie weit mein Ansatz jetzt richtig ist weiß ich nicht.

Die Textbox habe ich nur eingebaut um herauszufinden ob "changeCellDataGridView1" ausgeführt wird und sie gibt mir auch einen Wert aus.

Mein Problem ist immer noch das ich nicht weiß wie bzw. was ich bei einer Aktualisierung des DataGridView1 dem DataGridView2 übergeben muss.

Grüße Sword
 
Da stellt sich mir die Frage, ob du überhaupt dafür zwei DataGridViews brauchst. In deinem Fall möchtest du ja aus einer Tabelle den Primärschlüssel auslesen und daraus die Tabelle 2 im DataGridView darstellen, sehe ich das so richtig?
 
Wir benutzen hier ein SoftwareZertifizierungsSystem welches auf einer Access Datenbank basiert.
Leider ist die Oberfläche sehr verschachtelt, sodass man sehr viel Zeit benötigt um sich gewissen Sachen heraus zu suchen. Ein Mitarbeiter benötigt eine Zahlenkombination, die aus 3 Zahlen besteht, welche in zwei verschiedenen Tabellen liegen. Anhand einer UnitTestCase Bezeichnung, die im ersten GridView ausgewählt wird soll dann die zugehörige Nummer herausgesucht werden. Der zweite GridView wird also nicht zwingend benötigt, jedoch die Tabelle dahinter.

Ich bin mir auch überhaupt nicht mehr sicher ob ich die Relations zwischen den Tabellen richtig festgelegt habe.

Bild eins Zeigt diese zwei Tabellen und Bild zwei die Windows Form und
Bild drei wäre die Oberfläche wie sie funktionieren müsste.
 

Anhänge

  • tabellen.JPG
    tabellen.JPG
    23,3 KB · Aufrufe: 11
  • form.JPG
    form.JPG
    26,1 KB · Aufrufe: 9
  • Oberfläche.JPG
    Oberfläche.JPG
    38,2 KB · Aufrufe: 15
Nichts leichter als das. Da du aus der ersten Tabelle scheinbar nur die "ID" brauchst, kannst du dir die IDs z.B. in eine ComboBox laden und anhand was du da auswählst, wird dir dein DataGridView erstellt. Ich bastel dir grad mal eben ein Beispiel und fügs dann hier ein.
 
So, als erstes brauchst du ein DataGridView, ComboBox und einen Button. Den Button brauchst du nicht unbedingt, kannst ja auch das Event von der ComboBox nehmen OnChanged glaube ich war das. Als nächstes der Sourcecode, den ich auch als Zip dranhänge. Bestimmte Sachen kann man bestimmt besser realisieren, aber für das Verständnis schickst ja :)

Code:
using System;
using System.Data;
using System.Windows.Forms;
using System.Data.OleDb;

namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\deineDatenbank.mdb");
        DataSet dsID = new DataSet();        

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM T_HLSoftwareRequirements", con);
            OleDbCommand com = new OleDbCommand("SELECT HLSWReqNo FROM T_HLSoftwareRequirements", con);
            OleDbDataAdapter cmdID = new OleDbDataAdapter(com);
            DataTable dt = new DataTable();

            da.Fill(dt);
            dataGridView1.DataSource = dt;

            cmdID.Fill(dsID, "HLSWReqNo");

            comboBox1.DisplayMember = "HLSWReqNo";
            comboBox1.ValueMember = "HLSWReqNo";
            comboBox1.DataSource = dsID.Tables[0].DefaultView;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            OleDbDataAdapter da = new OleDbDataAdapter("SELECT UnitTestCase, LLSWReqNo, HLSWReqNo FROM T_LLSoftwareRequirements WHERE HLSWReqNo = " + comboBox1.SelectedValue.ToString(), con);
            DataTable dt = new DataTable();

            da.Fill(dt);
            dataGridView1.DataSource = dt;            
        }

        private void dataGridView1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                DataGridView.HitTestInfo hit = dataGridView1.HitTest(e.X, e.Y);
                if (hit.Type == DataGridViewHitTestType.Cell)
                {
                    if (hit.ColumnIndex == 0)
                    {
                        MessageBox.Show(dataGridView1.Rows[hit.RowIndex].Cells[hit.ColumnIndex].Value.ToString() + " " + dataGridView1.Rows[hit.RowIndex].Cells[hit.ColumnIndex + 1].Value.ToString());                     
                    }
                    else
                    {                        
                        MessageBox.Show(dataGridView1.Rows[hit.RowIndex].Cells[hit.ColumnIndex -1].Value.ToString() + " " + dataGridView1.Rows[hit.RowIndex].Cells[hit.ColumnIndex - 1].Value.ToString());
                    }
                }
            }
        }
    }
}

Hoffe ist alles verständlich, falls nicht einfach melden.
 

Anhänge

  • Access_DataGridView.zip
    12,3 KB · Aufrufe: 15
Zuletzt bearbeitet:
Habe ich mir wohl doch zu viel vorgenommen, so richtig komme ich damit nicht klar.

Ich habe mir jetzt erst einmal mit einem Office Formular geholfen. (Siehe Anhang)
Ein großes Problem ist meiner Meinung nach das im Hintergrund die zweite Tabelle durchsucht wird.

Aus der Tabelle T_LLSoftwareRequirements werden nur die Spalten LLSWRegNo, HLSWRegNo und UnitTestCase benötigt, wobei in UnitTestCase gesucht wird. In dieser Tabelle ist HLSWRegNo mit einem Schlüssel versehen.

Die Tabelle T_HLSoftwareRequirements enthält als einzigen wichtigen Wert SysRegNo.
Als Referenzwert gibt es aber auch noch HLSWRegNo, den man ja mit dem Unique Key aus Tabelle eins Verknüpfen könnte.

Nur das wie ist mir ein Rätsel.
 

Anhänge

  • formular.JPG
    formular.JPG
    48,3 KB · Aufrufe: 9
Zuletzt bearbeitet:
Also ich hab versucht das ganze mal nachzuvollziehen und hab eure Datenbank laut deinem Plan nachgebaut, schau dir mal die Abfragen an, das erreicht doch genau das was du haben willst. Und wo genau ist das Problem das ganze mit C# zu realisieren? Verstehst du den Code nicht?
 

Anhänge

  • tut.de.zip
    10,9 KB · Aufrufe: 13

Neue Beiträge

Zurück