Announcement

Collapse
No announcement yet.

Aus Datagridview Daten auslesen!

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

  • Aus Datagridview Daten auslesen!

    Hallo,
    ich habe ein Problem. Und zwar möchte ich Bilder öffnen deren Name in einer Access-Datenbank abgespeichert sind! Die Bilder selber sind in bestimmten Ordner abgelegt! Jetzt möchte ich wenn ich den Bildnamen im Datagridview anklicke, das sich das Bild in einer PicutreBox anzeigt!
    Sprich ich müsste es irgenwie schaffen die Namen der Bilder aus der Datenbank auszulesen und die Bilder zu öffnen!
    Hoffentlich kapiert das jemand was ich gemeind habe! :-)

    Gruß

  • #2
    Hallo,

    für diese Aufgabe sind mehrere Weg möglich. Bei dem folgenden Beispiel befindet sich im typisierten DataSet DataSetInMemoryTable die Tabelle TestTbl, die aus den Spalten testtbl_id und wert besteht:

    <div style="font-family: Courier New; font-size: 10pt; color: black; background: white; border-top: windowtext 1pt solid; padding-top: 0pt; border-left: windowtext 1pt solid; padding-left: 0pt; border-right: windowtext 1pt solid; padding-right: 0pt; border-bottom: windowtext 1pt solid; padding-bottom: 0pt;"><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: green;">' Alternative 1: Der direkte Zugriff über die Cells-Kollektion des DataGridView</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">Private</span> <span style="color: blue;">Sub</span> Button1_Click(<span style="color: blue;">ByVal</span> sender <span style="color: blue;">As</span> System.Object, _</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp; <span style="color: blue;">ByVal</span> e <span style="color: blue;">As</span> System.EventArgs) <span style="color: blue;">Handles</span> Button1.Click</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Label1.Text = TestTblDataGridView.CurrentRow.Cells(0).Value.ToSt ring()</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">End</span> <span style="color: blue;">Sub</span></p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: green;">' Alternative 2: BindingSource-Eigenschaft Current liefert die DataRowView-Instanz zurück</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">Private</span> <span style="color: blue;">Sub</span> Button2_Click(<span style="color: blue;">ByVal</span> sender <span style="color: blue;">As</span> System.Object, _</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp; <span style="color: blue;">ByVal</span> e <span style="color: blue;">As</span> System.EventArgs) <span style="color: blue;">Handles</span> Button2.Click</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">Dim</span> aRV <span style="color: blue;">As</span> DataRowView</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; aRV = TestTblBindingSource.Current</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Label1.Text = aRV(0).ToString()</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">End</span> <span style="color: blue;">Sub</span></p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: green;">' Alternative 3: Typsichere Implementierung der Alternative 2</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">Private</span> <span style="color: blue;">Sub</span> Button3_Click(<span style="color: blue;">ByVal</span> sender <span style="color: blue;">As</span> System.Object, _</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp; <span style="color: blue;">ByVal</span> e <span style="color: blue;">As</span> System.EventArgs) <span style="color: blue;">Handles</span> Button3.Click</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">Dim</span> aRV <span style="color: blue;">As</span> DataRowView</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; aRV = TestTblBindingSource.Current</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">Dim</span> aTTRow <span style="color: blue;">As</span> DataSetInMemoryTable.TestTblRow</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; aTTRow = <span style="color: blue;">DirectCast</span>(aRV.Row, DataSetInMemoryTable.TestTblRow)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Label1.Text = aTTRow.testtbl_id.ToString()</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">End</span> <span style="color: blue;">Sub</span></p></div>

    Die 3. Alternative ist zwar etwas aufwändiger, aber dafür kann die Programmierhilfe (IntelliSense) von Visual Studio verwendet werden, um sich die Spaltennamen der DataTable im DataSet auflisten zu lassen. Die 1. Alternative muss immer dann angepasst werden, wenn die Spaltenanordnung im DataGridView geändert wird (ist somit der schlechteste Weg!).
    Zuletzt editiert von Andreas Kosch; 06.02.2007, 14:08.

    Comment


    • #3
      Genial!
      Das ist des Rätsels Lösung!
      Vielen Dank!

      Comment


      • #4
        Jetzt hab ich es geschafft das ich den Inhalt der Zelle ausgelesen habe!
        Allerdings möchte ich jetzt mit der Zeichnungsnummer den Pfad zur PictureBox öffnen! Kann mir jemand helfen?
        Hier meine verzweifelten Versuche...
        Zur Info! Meine Zeichnungsnummern stehen in der Spalte 5 (Index = 4)



        Private Sub DataGridView1_CellContentClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick


        Dim zeichnung As String = Me.DataGridView1.CurrentCell.Value.ToString

        MessageBox.Show("Inhalt = " & zeichnung)

        If Me.DataGridView1.CurrentCell.Index = 4 Then

        zeichnung = "\\archiv-cad\zeichnungen\" & Microsoft.VisualBasic.Left(zeichnung, 4) & "\" & zeichnung
        Else
        zeichnung = "\\archiv-cad\zeichnungen\ohne Zeichnung"
        End If


        End Sub
        __________________________________________________ ____________
        Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click

        Dim zeichnung As System.Drawing.Image
        zeichnung = System.Drawing.Image.FromFile("\\Sag-file\archiv-cad\zeichnungen\2982\2982_aa_01")
        Me.PictureBox1.Image = zeichnung


        End Sub

        Comment


        • #5
          Hallo,

          nicht immer führt der Anfangs am einfachsten aussehende Weg auch dann noch auf kürzestem Weg zum Ziel, wenn zusätzliche Arbeiten nachgerüstet werden müssen. Das folgende Beispiel (siehe Anhang) zeigt, dass der elegantere Weg über das DataGridView-Ereignis CellContextMenuStripNeeded auch der bessere Weg ist:

          <div style="font-family: Consolas; font-size: 10pt; color: black; background: white;"><p style="margin: 0px;"><span style="color: green;">' ContextMenuStrip-Komponente von der Toolbox auf das Formular ziehen, </span></p><p style="margin: 0px;"><span style="color: green;">' Menüpunkt "Anzeigen" anlegen</span></p><p style="margin: 0px;"><span style="color: green;">'</span></p><p style="margin: 0px;"><span style="color: green;">' DataGridView-Spalte grafikpfad über die Eigenschaft ContextMenuStrip mit der </span></p><p style="margin: 0px;"><span style="color: green;">' ContextMenuStrip-Komponente verbinden</span></p><p style="margin: 0px;"><span style="color: green;">'</span></p><p style="margin: 0px;"><span style="color: green;">' Ereignisbehandlungsmethode für das DataGridView-Ereignis CellContextMenuStripNeeded anlegen</span></p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;"><span style="color: blue;">Public</span> <span style="color: blue;">Class</span> Form1</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">Private</span> <span style="color: blue;">Sub</span> Form1_Load(<span style="color: blue;">ByVal</span> sender <span style="color: blue;">As</span> System.Object, <span style="color: blue;">ByVal</span> e <span style="color: blue;">As</span> System.EventArgs) <span style="color: blue;">Handles</span> <span style="color: blue;">MyBase</span>.Load</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; DataSet1.DataTable1.AddDataTable1Row(<span style="color: #a31515;">"Feder"</span>, <span style="color: #a31515;">"C:\Windows\Feder.bmp"</span>)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; DataSet1.DataTable1.AddDataTable1Row(<span style="color: #a31515;">"Granit"</span>, <span style="color: #a31515;">"C:\Windows\Granit.bmp"</span>)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; DataSet1.DataTable1.AddDataTable1Row(<span style="color: #a31515;">"Kaffeetasse"</span>, <span style="color: #a31515;">"C:\Windows\Kaffeetasse.bmp"</span>)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">End</span> <span style="color: blue;">Sub</span></p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: green;">' Über das Kontextmenü ausgewählte DataGridView-Zelle zwischenpuffern</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">Private</span> aCurrentGrafikpfadCell <span style="color: blue;">As</span> DataGridViewCell</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">Private</span> <span style="color: blue;">Sub</span> AnzeigenToolStripMenuItem_Click(<span style="color: blue;">ByVal</span> sender <span style="color: blue;">As</span> System.Object, <span style="color: blue;">ByVal</span> e <span style="color: blue;">As</span> System.EventArgs) <span style="color: blue;">Handles</span> AnzeigenToolStripMenuItem.Click</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">Dim</span> zeichnung <span style="color: blue;">As</span> System.Drawing.Image</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; zeichnung = System.Drawing.Image.FromFile(aCurrentGrafikpfadCe ll.Value)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">Me</span>.PictureBox1.Image = zeichnung</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ToolStripStatusLabel1.Text = aCurrentGrafikpfadCell.Value</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">End</span> <span style="color: blue;">Sub</span></p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: green;">' Anwender wählt im DataGridView über das Kontextmenü eine Grafik zur Anzeige aus</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">Private</span> <span style="color: blue;">Sub</span> DataTable1DataGridView_CellContextMenuStripNeeded( <span style="color: blue;">ByVal</span> sender <span style="color: blue;">As</span> System.Object, <span style="color: blue;">ByVal</span> e <span style="color: blue;">As</span> System.Windows.Forms.DataGridViewCellContextMenuSt ripNeededEventArgs) <span style="color: blue;">Handles</span> DataTable1DataGridView.CellContextMenuStripNeeded</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">Dim</span> aDGV <span style="color: blue;">As</span> DataGridView = <span style="color: blue;">DirectCast</span>(sender, DataGridView)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">If</span> (e.ColumnIndex = 2) <span style="color: blue;">Then</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; aCurrentGrafikpfadCell = <span style="color: blue;">DirectCast</span>(aDGV.Rows(e.RowIndex).Cells(e.ColumnIndex), DataGridViewCell)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">End</span> <span style="color: blue;">If</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">End</span> <span style="color: blue;">Sub</span></p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;"><span style="color: blue;">End</span> <span style="color: blue;">Class</span></p></div>

          Wenn im DataGridView die Grafikspalte als DataGridViewImageCell konfiguriert wird, kann das DataGridview die Grafik direkt anzeigen (wobei die Grafik auch in der Datenbank abgelegt werden kann, so dass ein Nachladen über das Festplattenverzeichnis nicht mehr notwendig ist).
          Attached Files

          Comment


          • #6
            Hallo
            bin auf diesen thread gestoßen weil ich ein ähnliches Problem habe.
            Hoffe mir ist zu helfen.
            Also folgendes:
            Habe eine Bingingsource auf die ich einen Filter anwende.
            Nachdem gefiltert ist möchte ich die einzelnen Spalten durchgehen und prüfen ob die Zellen leer sind sollten alle Zellen leer sein soll die Spalte ausgeblendet werden.

            BeispielBindingsource.Filter = "ID LIKE' " + textfeld.Text + "%' ";

            //hier kommt das Problem
            if dataGridViewTextBoxColumn7 = leer
            {
            dataGridViewTextBoxColumn7.Visible = false;
            }

            ich schaff es einfach nicht den Inhalt einer Zelle mit " " zu vergleichen

            Über jede andere Lösung die zum selben Ergebnis kommt wäre ich selbstverstäblich auch glücklich.

            Comment


            • #7
              Hallo,

              ich schaff es einfach nicht den Inhalt einer Zelle mit " " zu vergleichen
              das reicht auch nicht aus, denn im DataGridView soll die Spalte ja nur dann verborgen werden, wenn in allen Datensätzen in diesem Feld der DataTable kein Wert eingetragen ist. Das folgende Beispiel verwendet daher einen anderen Weg. Über eine Hilfs-DataTable wird zusätzlich auch noch die zu verbergende Spalte geprüft. Nur dann, wenn alle gefilterten Datensätze auch in der Wert-Spalte keinen Eintrag haben, wird die DataGridView-Spalte verborgen:

              <div style="font-family: Consolas; font-size: 10pt; color: black; background: white;"><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">Private</span> <span style="color: blue;">Sub</span> Form1_Load(<span style="color: blue;">ByVal</span> sender <span style="color: blue;">As</span> System.Object, _</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp; <span style="color: blue;">ByVal</span> e <span style="color: blue;">As</span> System.EventArgs) <span style="color: blue;">Handles</span> <span style="color: blue;">MyBase</span>.Load</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: green;">'</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: green;">' Spalten id (AutoIncrement), wert und kriterium mit Testdaten füllen</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: green;">'</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; DataSet1.DataTable1.AddDataTable1Row(<span style="color: #a31515;">"Test A 1"</span>, <span style="color: #a31515;">"A"</span>)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; DataSet1.DataTable1.AddDataTable1Row(<span style="color: #a31515;">"Test A 2"</span>, <span style="color: #a31515;">"A"</span>)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; DataSet1.DataTable1.AddDataTable1Row(<span style="color: #a31515;">""</span>, <span style="color: #a31515;">"B"</span>)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; DataSet1.DataTable1.AddDataTable1Row(<span style="color: #a31515;">""</span>, <span style="color: #a31515;">"B"</span>)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; DataSet1.DataTable1.AddDataTable1Row(<span style="color: #a31515;">""</span>, <span style="color: #a31515;">"B"</span>)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; DataSet1.DataTable1.AddDataTable1Row(<span style="color: #a31515;">"Test C 1"</span>, <span style="color: #a31515;">"C"</span>)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">End</span> <span style="color: blue;">Sub</span></p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">Private</span> <span style="color: blue;">Sub</span> ToolStripBtnFilter_Click(<span style="color: blue;">ByVal</span> sender <span style="color: blue;">As</span> System.Object, _</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp; <span style="color: blue;">ByVal</span> e <span style="color: blue;">As</span> System.EventArgs) <span style="color: blue;">Handles</span> ToolStripBtnFilter.Click</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; DataTable1BindingSource.Filter = <span style="color: #a31515;">"kriterium = 'B'"</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">Dim</span> aDV <span style="color: blue;">As</span> DataView = DataSet1.DataTable1.DefaultView</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; aDV.RowFilter = <span style="color: #a31515;">"(kriterium = 'B') AND (wert &lt;&gt; '')"</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">Dim</span> aDT <span style="color: blue;">As</span> DataTable = aDV.ToTable</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: green;">' Spalte "Wert" verbergen, wenn dort in allen Datensätzen nichts steht</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; DataGridViewTextBoxColumnWert.Visible = <span style="color: blue;">Not</span> aDT.Rows.Count = 0</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">End</span> <span style="color: blue;">Sub</span></p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">Private</span> <span style="color: blue;">Sub</span> ToolStripBtnFilterOff_Click(<span style="color: blue;">ByVal</span> sender <span style="color: blue;">As</span> System.Object, _</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp; <span style="color: blue;">ByVal</span> e <span style="color: blue;">As</span> System.EventArgs) <span style="color: blue;">Handles</span> ToolStripBtnFilterOff.Click</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; DataTable1BindingSource.Filter = <span style="color: blue;">String</span>.Empty</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; DataGridViewTextBoxColumnWert.Visible = <span style="color: blue;">True</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">End</span> <span style="color: blue;">Sub</span></p></div>
              Attached Files

              Comment


              • #8
                Hallo

                Da ich sehe, dass hier jemand so tolle Erklärungen zur DataGridView hat, möchte ich eine Frage anhängen:
                Wie erhalte ich den Wert der Checkbox und wie ändere ich ein Bild eines Image.
                Also wenn ich ein Column als DataGridViewCheckBox oder DataGridViewImageCell definiert habe. Der Wert ".Value" bleibt immer auf Nothing. Und wenn ich folgendes aufrufe, dann ist der Wert manchmal nicht aktualisiert angezeigt, wenn ich über das MouseUp oder CellLeave Event gehe.

                Code:
                 Private Sub DataGridView_CurrentCellDirtyStateChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles DataGridView.CurrentCellDirtyStateChanged
                        If DataGridView.CurrentCell.ColumnIndex = 1 Then
                            If DataGridView.IsCurrentCellDirty = True Then
                                DataGridView.CommitEdit(DataGridViewDataErrorContexts.Commit)
                            End If
                        End If
                    End Sub

                Comment

                Working...
                X