| |  | Online-Kurs: Grundlagen des 3D-Druck-Designs für Industrieingenieure , ein Kurs
|
Autor
|
Thema: VB.NET 2005: DataGridView (18631 mal gelesen)
|
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles... i.R.

 Beiträge: 2678 Registriert: 06.11.2000
|
erstellt am: 26. Apr. 2007 14:57 <-- editieren / zitieren --> Unities abgeben:         
Hallo Experten, ich hab da mal wieder ein Problem: Ich benötige in einer Form ein DataGridView-Control, das NICHT mit irgendeiner Datenquelle verbunden ist, ich möchte das zur Laufzeit mit Daten füllen. Aus den verschiedenen Hilfe-Beiträgen zum Thema DataGridview werde ich beim besten Willen nicht schlau. Das beste Beispiel, das ich bisher gefunden habe, sieht etwa so aus: Erst werden die String-Arrays für die einzelnen Zeilen deklariert und dabei gleich mit Werten gefüllt: Dim row0 As String() = {"11/22/1968", "29", "Revolution 9", "Beatles", "The Beatles [White Album]"} Dim row1 As String() = {"4/4/1960", "6", "Fools Rush In", "Frank Sinatra", "Nice 'N' Easy"} ...
Dann werden diese in die DataGridView geschrieben: With Me.dataGridView1.Rows .Add(row0) .Add(row1) ... End With
Meine Problem dabei: 1. meine Daten werden erst zur Laufzeit ermittelt, wie kriege ich die in eine Variable, die mit dim row1= string() deklariert wurde? 2. Eine Spalte ist vom Typ Bitmap, sie soll .bmp-Icons anzeigen. Wie bekomme ich die da hinein? Bitte bitte, sagt mir, dass das ganz leicht ist! ------------------ Klaus www.al-ko.com | mein Gästebuch | privat... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tbd Moderator Teamleiter
  
 Beiträge: 825 Registriert: 26.01.2006 Dell Percision T5400 Intel(R) Xeon(R) CPU X5460 @ 3.16GHz 3,25 GB RAM Nvidia Quadro FX 4600
|
erstellt am: 27. Apr. 2007 07:30 <-- editieren / zitieren --> Unities abgeben:          Nur für KMassler
Guten Morgen Klaus, ich persönlich befülle ein DataGridView über zuvor definierte Objekte. Ich habe dir mal einen Codeschnipsel aus SDA-QuickPrint angehängt. In dieser Anwendung gibt es ein Formular, in welchem der User in einem DataGridView seine Druckereinstellungen festlegt. Ich schätze, dass dir dieses kleine Beispiel als Experte weiter helfen wird. Code:
Private Function ReihenHinzufuegen() As Boolean Try Dim oReihe As DataGridViewRow oReihe = New DataGridViewRow oReihe.HeaderCell.Value = "DIN A4 Hochformat" oReihe.HeaderCell.Style.Alignment = _ DataGridViewContentAlignment.MiddleLeft oReihe.Frozen = True Me.dgvDrucker.Rows.Add(oReihe) oReihe = New DataGridViewRow oReihe.HeaderCell.Value = "DIN A4 Querformat" oReihe.HeaderCell.Style.Alignment = _ DataGridViewContentAlignment.MiddleLeft oReihe.Frozen = True Me.dgvDrucker.Rows.Add(oReihe) oReihe = New DataGridViewRow oReihe.HeaderCell.Value = "DIN A3" oReihe.HeaderCell.Style.Alignment = _ DataGridViewContentAlignment.MiddleLeft oReihe.Frozen = True Me.dgvDrucker.Rows.Add(oReihe) oReihe = New DataGridViewRow oReihe.HeaderCell.Value = "DIN A2" oReihe.HeaderCell.Style.Alignment = _ DataGridViewContentAlignment.MiddleLeft oReihe.Frozen = True Me.dgvDrucker.Rows.Add(oReihe) oReihe = New DataGridViewRow oReihe.HeaderCell.Value = "DIN A1" oReihe.HeaderCell.Style.Alignment = _ DataGridViewContentAlignment.MiddleLeft oReihe.Frozen = True Me.dgvDrucker.Rows.Add(oReihe) oReihe = New DataGridViewRow oReihe.HeaderCell.Value = "DIN A0" oReihe.HeaderCell.Style.Alignment = _ DataGridViewContentAlignment.MiddleLeft oReihe.Frozen = True Me.dgvDrucker.Rows.Add(oReihe) Return True Catch ex As Exception Debug.Assert(False) Trace.WriteLineIf(True, _ "Fehler: Wo: " & ex.StackTrace & " Was: " & ex.Message) Return False End Try End Function Private Function DruckerInsDgvComEinfuegen() As Boolean Try Dim oComDgvDrucker As DataGridViewComboBoxCell Dim oComDgvOrientierung As DataGridViewComboBoxCell Dim sOrientierungArray() As String = {"Hoch", "Quer"} For iFormate As Integer = 0 To Me.dgvDrucker.Rows.Count - 1 oComDgvDrucker = CType(Me.dgvDrucker.Rows(iFormate).Cells(0), _ DataGridViewComboBoxCell) oComDgvOrientierung = CType(Me.dgvDrucker.Rows(iFormate).Cells(2), _ DataGridViewComboBoxCell) oComDgvDrucker.Items.AddRange(sDruckerNamenFrm) oComDgvOrientierung.Items.AddRange(sOrientierungArray) Next Return True Catch ex As Exception Debug.Assert(False) Trace.WriteLineIf(True, _ "Fehler: Wo: " & ex.StackTrace & " Was: " & ex.Message) Return False End Try End Function
Wie man allerdings ein Bitmap in das DataGridView bekommt weis ich leider auch nicht. Es gibt verschiedene DataGridViewCell Objekte wie das in meinem Beispiel (DataGridViewComboBoxCell). Dieses Steht für eine ComboBox im DataGridView. Es gibt dort noch mehr, aber ob es auch eine PictureBox im DataGridView gibt? Glaube ich kaum. Grüße und schönes, hoffentlich verlängertes Wochenende!
------------------ Mfg Daniel Lesen ist super. Nur die Buchstaben machen einen verrückt! ------------------
SolidWorks Programmierung | Tools | Makros | Software; Schuler Design Automation GmbH Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles... i.R.

 Beiträge: 2678 Registriert: 06.11.2000
|
erstellt am: 27. Apr. 2007 08:02 <-- editieren / zitieren --> Unities abgeben:         
Zitat: Original erstellt von tbd: ...als Experte....
He he danke für die Blumen, aber wir wollen mal auf dem Boden bleiben Ich kann jetzt nicht behaupten, dass ich den Code auf Anhieb begriffen habe, aber ich arbeite daran. Zitat: ... Es gibt dort noch mehr, aber ob es auch eine PictureBox im DataGridView gibt? Glaube ich kaum.
Doch, gibt es (sie Abbildung oben). Der Clumn-Type heißt dann "DataGridViewImageColumn". Aber wie befüllen...??? Ah ja, vergessen: ich werkel da mit vb.net 2005 Express herum, obs das so z.B. auch schon in vb.net 2003 gibt, weiß ich nicht. Und das mit dem langen Wochenende wird nix, den Tag Urlaub spar ich mir. Danke und Ciao ------------------ Klaus www.al-ko.com | mein Gästebuch | privat... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tbd Moderator Teamleiter
  
 Beiträge: 825 Registriert: 26.01.2006 Dell Percision T5400 Intel(R) Xeon(R) CPU X5460 @ 3.16GHz 3,25 GB RAM Nvidia Quadro FX 4600
|
erstellt am: 27. Apr. 2007 08:13 <-- editieren / zitieren --> Unities abgeben:          Nur für KMassler
Zitat: Original erstellt von KMassler: He he danke für die Blumen, aber wir wollen mal auf dem Boden bleiben
Scheint aber doch so zu sein! Du hast dir die Antwort ja fast selbst gegeben. Die Bitmapzelle wird durch das DataGridView Objekt DataGridViewImageCell festgelegt. Ich schätze mal das die Property Value das Bild festlegt. Um also ein Bitmap in die Zelle zu bekommen könntest du evtl. (Habe den Code nicht getestet) so vorgehen:
Code:
'Zelle der Spalte 4 in Zeile 1 BitmapZelle = CType(DataGridView.Item(3, 0), DataGridViewImageCell) BitmapZelle.Value = ...
Ja das DataGridView ist so mächtig das man darüber wahrscheinlich ein eigenes Buch lesen muss um es wirklich und vollstädig zu verstehen! ------------------ Mfg Daniel Lesen ist super. Nur die Buchstaben machen einen verrückt! ------------------
SolidWorks Programmierung | Tools | Makros | Software; Schuler Design Automation GmbH Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles... i.R.

 Beiträge: 2678 Registriert: 06.11.2000
|
erstellt am: 27. Apr. 2007 12:31 <-- editieren / zitieren --> Unities abgeben:         
Na, ob das LEsen des Buchs bei mir reichen würde, um das zu verstehen... Mein DataGrid kann ich jetzt schon mal füllen (erst mal nur Text , die Bitmap tu ich mir erst später an) und auch auslesen, aber: Wo finde ich den Index einer ausgewählten Zeile? Ich finde das einfach nicht. Und die Microsoft-Hilfe mit dem Verweis-Dschungel macht mich wahnsinnig! [Edit] Habs!! Ist ja so easy, wenn mans weiß! Ind = DataGridView.CurrentCell.RowIndex [/Edit] ------------------ Klaus www.al-ko.com | mein Gästebuch | privat... [Diese Nachricht wurde von KMassler am 27. Apr. 2007 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tbd Moderator Teamleiter
  
 Beiträge: 825 Registriert: 26.01.2006 Dell Percision T5400 Intel(R) Xeon(R) CPU X5460 @ 3.16GHz 3,25 GB RAM Nvidia Quadro FX 4600
|
erstellt am: 27. Apr. 2007 12:40 <-- editieren / zitieren --> Unities abgeben:          Nur für KMassler
Mahlzeit Klaus, Nicht aufgeben! Die Eigenschaft Rows stellt eine Zeilencollection. Diese kannst du wie jede Collection behandeln, also mit Hilfe einer For Each Schleife alle vorhandenen Zeilen abarbeiten oder durch Iten(x) die Zeile direkt ansprechen. Hier mal ein bisschen Beispielcode zur Verdeutlichung: Code:
Dim DataGridViewRow As DataGridViewRow For Each DataGridViewRow In DataGridView.Rows 'z.B. richtige Zeile durch den Index filtern If DataGridViewRow.Index = x Then ... End If Next 'Index direkt anprechen DataGridViewRow = DataGridView.Rows.Item(x)
Bei den Spalten ist die Vorgehensweise die gleiche. Anstelle der Rows Property verwendet man hier natürlich die Columns Property Ups vergessen! Ausgewählte Zeilen findest du in der SelectedRows Property. Code: 'Maktrierte Zeilen DataGridView.SelectedRows
------------------ Mfg Daniel
Lesen ist super. Nur die Buchstaben machen einen verrückt! ------------------
SolidWorks Programmierung | Tools | Makros | Software; Schuler Design Automation GmbH Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles... i.R.

 Beiträge: 2678 Registriert: 06.11.2000
|
erstellt am: 27. Apr. 2007 13:12 <-- editieren / zitieren --> Unities abgeben:         
Danke danke.. das mit dem Index hab ich im Prinzip schon begriffen .. aber ..naja.. DataGridView.SelectedRows gibt mir aber nicht den Index der Zeile, aber das Problem hab ich ja schon gelöst (s.o.). Aber weiter gehts: ich würde gerne einzelne Zeilen verschieben..nach oben, nach unten...egal. Dazu wollte ich DataGridView.Rows.InsertCopy(QuellIndex, ZielIndex), um erst mal eine Kopie der Zeile an der neuen Stelle zu erzeugen, und dann die alte Zeile mit DataGridView.Rows.Remove(index) entfernen. Das Entfernen geht , er fügt mir bei dem InsertCopy auch eine Zeile an der richtigen Stelle ein..nur ist die immer leer.. Aber wie auch immer...ich mach jetzt erst mal Wochenende und beschäftige mich am Montag wieder damit. Vielleicht gehts dann ja, wer weiß. Auf jeden Fall vielen Dank für die Geduld ------------------ Klaus www.al-ko.com | mein Gästebuch | privat... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles... i.R.

 Beiträge: 2678 Registriert: 06.11.2000 SolidWorks Start 1999 ** CSWP 01/2008 ** ------------------ Zuletzt beruflich: - SWX2020 SP5; - SAP/PLM+ECTR; - DriveWorks Pro; - Programmierung: VBA, aktuell Visual Studio 2022/VB.Net ------------------ privat: ab 2024 Onshape seit 2025 SolidWorks for Makers
|
erstellt am: 03. Mai. 2007 13:57 <-- editieren / zitieren --> Unities abgeben:         
Nach langem hin und her hab ich zumindest geschafft, dass das Rauf- und Runterschieben der Zeilen funktioniert...wenn auch wohl nicht so, wie sich die Erfinder der DataGridView das gedacht hatten: Code: Private Sub btnDn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDn.Click 'Eintrag eine Zeile nach unten verschieben Dim sDGVRow() As Object = {Nothing, "", "", "", "", ""} Dim n As Integer Dim Ind As Integer Ind = DataGridView.CurrentCell.RowIndex If Ind = DataGridView.Rows.Count - 1 Then Exit Sub 'sDGVRow füllen For n = 1 To UBound(sDGVRow) sDGVRow(n) = DataGridView.Rows(Ind).Cells(n).Value Next DataGridView.Rows.Insert(Ind + 2, sDGVRow) DataGridView.Rows.Remove(DataGridView.Rows(Ind)) 'Zeile wieder selektieren: DataGridView.CurrentCell = DataGridView.Rows(Ind + 1).Cells(1) End Sub
In dem Beispiel wird die aktuell gewählte Zeile und eine Zeile nach unten geschoben, das Schieben nach oben, an den Anfang und ans Ende funktioniert analog. Ich verstehe aber trotzdem nicht, warum das .InsertCopy nur leere Zeilen erzeugt, das ist ja wohl nicht im Sinne der Erfinder. Naja, das soll mir so genügen, sind halt ein paar Zeilen mehr als nötig.Die erste Spalte bleibt bei mir vorerst auf "Nothing", bis ich wieder Zeit genug habe, mich damit zu befassen, wie ich da meine Bitmaps rein bekomme. Da werde ich mich bestimmt wieder hier voller Verzweiflung melden  Bis dahin vielen Dank und Ciao ------------------ Klaus www.al-ko.com | mein Gästebuch | privat... [Diese Nachricht wurde von KMassler am 03. Mai. 2007 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
pogoist Mitglied
 Beiträge: 1 Registriert: 23.05.2007
|
erstellt am: 23. Mai. 2007 15:23 <-- editieren / zitieren --> Unities abgeben:          Nur für KMassler
Hallo Klaus, ich hab das selbe Problem mit dem Zeilen verschieben. Bilder darstellen funktioniert aber so: Wenn du ein ungebundenes Datagrid nimmst, musst du als Datentyp für die Spalte wo das Bild rein soll "DataGridViewImagecColumn" nehmen. Bei einem gebundenen muss der Datentyp der Spalte des Datasource Drawing.Bitmap sein. hier ein Beispiel Code, die Bilder sind im VB in den Resourcen eingebettet: Dim imglist As New ImageList Dim column_edit As DataGridViewColumn = DataGridView1.Columns("Bildspalte") imglist.Images.Add("Bild1", My.Resources.bild1) ' Hier kannst du mehrere Bilder hinzufügen 'imglist.Images.Add("Bild2", My.Resources.bild2) imglist.ImageSize = New System.Drawing.Size(14, 14) imglist.TransparentColor = Color.Transparent imglist.ColorDepth = ColorDepth.Depth32Bit Dim img As Image = imglist.Images("bild1") DataGridView1.Rows(index).Cells().Item(2).Value = img
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles... i.R.

 Beiträge: 2678 Registriert: 06.11.2000 SolidWorks Start 1999 ** CSWP 01/2008 ** ------------------ Zuletzt beruflich: - SWX2020 SP5; - SAP/PLM+ECTR; - DriveWorks Pro; - Programmierung: VBA, aktuell Visual Studio 2022/VB.Net ------------------ privat: ab 2024 Onshape seit 2025 SolidWorks for Makers
|
erstellt am: 05. Sep. 2007 11:10 <-- editieren / zitieren --> Unities abgeben:         
|
tbd Moderator Teamleiter
  
 Beiträge: 825 Registriert: 26.01.2006 Dell Percision T5400 Intel(R) Xeon(R) CPU X5460 @ 3.16GHz 3,25 GB RAM Nvidia Quadro FX 4600
|
erstellt am: 05. Sep. 2007 11:17 <-- editieren / zitieren --> Unities abgeben:          Nur für KMassler
Guten Morgen Klaus, du kannst dir ein Image Objekt auch durch eine Datei oder einen Stream befüllen. Wenn ich mir den Beitrag auf die Schnelle richtig durchgelesen habe, ist es ungefähr das was du suchst:
Code:
Dim oImglist As New ImageList Dim oImage As System.Drawing.Image oImage = System.Drawing.Image.FromFile("D:\bda\Eigene Bilder\Beispiel.bmp") oImglist.Images.Add(oImage)
Ich hoffe das ich dich richtig verstanden habe und dir helfen konnte! ------------------ Mfg Daniel Wer A sagt, der muss nicht B sagen. Er kann auch erkennen, dass A falsch war. Bertolt Brecht ------------------ VBasic / vb.net / vbs / wsh | Freeware Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles... i.R.

 Beiträge: 2678 Registriert: 06.11.2000
|
erstellt am: 05. Sep. 2007 12:15 <-- editieren / zitieren --> Unities abgeben:         
Danke danke! Jetzt hab ichs auch (fast) selber geschafft Was doch so ne monatelange Pause bewirken kann So siehts aus:
Code:
Function ReadFile() Dim sDGVRow() As Object = {Nothing, "", "", "", "", ""} Dim PictureName As String Dim Pic As Bitmap Dim strDummy As String Dim Record() As String Dim n As Byte Dim Pos As Integer Dim fStream As FileStream Try fStream = New FileStream(Me.TextBox1.Text, _ FileMode.Open, FileAccess.Read, _ FileShare.Read) Catch Return False End Try Dim sReader As New StreamReader(fStream, _ Encoding.GetEncoding("iso8859-1")) DataGridView.Rows.Clear() Do Until sReader.Peek = -1 For n = 1 To UBound(sDGVRow) 'RowObject-Array mit leeren Inhalten vorbelegen sDGVRow(n) = "" Next n sDGVRow(0) = Nothing 'Zeilenweise auslesen: strDummy = sReader.ReadLine If Microsoft.VisualBasic.Left(strDummy, 1) <> "#" _ And Trim(strDummy) <> "" Then 'Zeile ist kein Kommentar und nicht leer, also verwenden: ' ... ist gültige Menüzeile Record = Split(strDummy, "|") 'den erhaltenen Record umsetzen in das Row-Array, 'ist nötig, da das object-Array sDGVRow ein zusätzliches Bildobjekt enthält For n = 0 To UBound(Record) If n < UBound(sDGVRow) Then sDGVRow(n + 1) = Record(n) 'Und nun noch den Dateinamen für das Bild auswerten und Bild einfügen: If n = 2 Then 'Record(2) enthält den Bildnamen PictureName = Record(n) '... If PictureName <> "" Then 'Bildname angegeben... 'ist Bild vorhanden? Try Pic = New Bitmap(PictureName) sDGVRow(0) = Pic Catch 'Fehler aufgetreten, Bilddatei vielleicht nicht da? End Try End If End If Next 'sDGVRow ist fertig befüllt, 'sDGVRow-Object zum DataGridView hinzufügen DataGridView.Rows.Add(sDGVRow) End If End If Loop sReader.Close() fStream.Close() Return True End Function
Könnte vielleicht noch verbessert und vereinfacht werden, aber es klappt. Und jetzt muss ich mich noch darum kümmern, dass das Bild ausgetauscht wird, wenn das entsprechende Feld in der DataGridView editiert wurde, das den Dateinamen enthält. Aber das pack ich auch noch irgendwann  Gruß und danke ------------------ Klaus
www.al-ko.com | mein Gästebuch | privat... [Diese Nachricht wurde von KMassler am 05. Sep. 2007 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
 |