vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Brandneu! sevEingabe v3.0 - Das Eingabecontrol der Superlative!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   RSS-Feeds  | Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2020
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Zellen einer DGV mit Auswahllisten versehen 
Autor: woha
Datum: 12.10.20 16:43

Hallo!


nachdem ich nun schon einige Zeit daran herum tüftle, suche und probiere, aber leider zu keiner Lösung gefunden habe, möchte ich Euch um einen Hinweis zu folgender Problemstellung bitte:

Situation:

ich habe eine DataGridView, die ich aus einer DataTable fülle.
Dabei werden in jeder Zeile Informationen aus einer Datei eingelesen, die ich nun (in einer einzigen Werte Spalte) ändern möchte.
Für manche Zeile (rows) könnte es nun Auswahllisten geben, die einem das wiederholte Tippen der selben Texte ersparen sollte, aber trotzdem die Möglichkeit gibt, einen eigenen Text frei in das Textfeld zu schreiben.

D.h. wie kann ich elegant sowohl eine einfache Texteingabe als auch eine - vermutlich - Comboboxliste für ein und die selbe Spalte erlauben?

Und wie lege ich die Auswahllisten am besten fest.
Ich würde sie gerne direkt aus einer XML Datei einlesen, denn diese hätte ich ohnehin, da sie die Einstellungen und Parameter der DataTable/DatGridView definiert.


PS.: bin beim Thema DGV und vb.net noch eher am Anfang, daher schon vorab ein Dankeschön für Eure Geduld und Euer Verständnis, bei dieser vermutlich lapidaren Fragestellung!
Ich denke, es fehlt mir der kleine aber feine Tipp, der mich hier wieder weiter bringt.

DANKE!

mfg
Wolfgang
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zellen einer DGV mit Auswahllisten versehen 
Autor: effeff
Datum: 12.10.20 18:14

//D.h. wie kann ich elegant sowohl eine einfache Texteingabe als auch eine - vermutlich - Comboboxliste für ein und die selbe Spalte erlauben?//

Der Inhalt der ComboBox-Spalte käme aus einer definierten Liste (z. B. einer DataTable), d. h., Du kannst keinen Freitext eingeben.

//Und wie lege ich die Auswahllisten am besten fest.
Ich würde sie gerne direkt aus einer XML Datei einlesen, denn diese hätte ich ohnehin, da sie die Einstellungen und Parameter der DataTable/DatGridView definiert.//

Wenn die bereits von Dir benutzte DataTable aus einer Datenbank erstellt wird, dann lege doch Deine LookUp-Daten dort auch ab. Dann könntest Du typisiert arbeiten und Dir das Leben sehr einfach machen...

EALA FREYA FRESENA

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zellen einer DGV mit Auswahllisten versehen 
Autor: woha
Datum: 12.10.20 18:27

Hallo effeff,

Danke schon für Deine ersten Antworten.

D.h. es gibt keine Möglichkeit, sowohl eine Liste als auch freien Text zu benutzen?

Und wie müsste man die DataTable für die Benutzung eines LookUps umgestalten?
Momentan definiere ich ja nur meine gewünschten Columns, und dann lese ich die rows entsprechend aus den Eigenschaften meiner Datei ein.

Wären die LookUps (Combo Boxen) dann einfach in einer andere DT?

Und - wenn dies möglich wäre - wie würde kurz der Code aussehen um die Combo Lookup an die Spalte zu hängen?
Nur die Spalte als DataGridComboColumn definieren?

Wobei, ohne Möglichkeit in einem Großteil der Zellen freien Text zu schreiben, wird es nicht hilfreicher.

Danke
mfg
Wolfgang
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zellen einer DGV mit Auswahllisten versehen 
Autor: effeff
Datum: 12.10.20 20:18

//D.h. es gibt keine Möglichkeit, sowohl eine Liste als auch freien Text zu benutzen?//

Das macht keinen Sinn. Um das zu verdeutlichen:

Du hast normalerweise eine DataTable1, Z. B. mit einem ganz einfachen Inhalt:

ID, Nachname, DienstAmWochentag

Alle Spalten sind vom Typ Integer, ID ist Primärschlüssel.

Dann hast Du eine DataTable2, z. B. mit diesem Inhalt:

ID, Nachname

ID ist Integer und Primärschlüssel, Nachname ist varchar(50).

Als letztes hast Du eine DataTable3 mit Inhalt:

ID, Wochentag

ID ist wieder Integer, Wochentag ist varchar(10).

Es geht hierbei um einen ganz einfachen Dienstplan. Es soll in einem DataGridview einfach nur eine Auslistung erscheinen, wer an welchem Wochentag Dienst hat.

Nehmen wir an, dass die DataTable2 folgende gefüllt ist:

1, Müller
2, Schmidt
3, Meier

Nehmen wir an, dass die DataTable3 wie folgt gefüllt ist:

1, Montag
2, Dienstag
3, Mittwoch
4, Donnerstag
5, Freitag
6, Samstag
7, Sonntag

Du würdest jetzt in dem DataGridView die Spalte 2 als ComboBoxSpalte definieren, die als Liste die Namen der DataTable2 beinhaltet. Als Spalte 3 würdest Du eine ComboBoxSpalte definieren, die als Liste die Wochentagsnamen aus der DataTable3 beinhaltet. Die ValueMember wären also die IDs, die DisplayMember wären also die Nachname bzw. die Wochentagsnamen. Als Werte für die DataTable1 werden also nur die IDs übergeben. Verstehst Du das Prinzip? Das nennt sich relationale Datenhaltung.

EALA FREYA FRESENA

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zellen einer DGV mit Auswahllisten versehen 
Autor: effeff
Datum: 12.10.20 21:22

Du willst meiner Meinung nach nur Werte aus einer ComboBox in Deine DataTable übernehmen. Dazu würde sich eine zweite Form anbieten, die nur eine ComboBox mit Inhalt und einen Button hat. Du würdest im DataGridView den MouseButton abfragen, und wenn dieses der rechte ist und die gewünschte Spalte ausgewählt ist, die Form2 anzeigen lassen. Nach dem Beenden der Form2 würde der Inhalt dann in die DataGridView-Zelle unter der Maus eingetragen werden:

Public Class Form1
 
    Dim dtWochenplan As DataTable
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
 
        dtDatenInitialisieren()
        DataGridView1Initialisieren()
 
    End Sub
 
    Private Sub dtDatenInitialisieren()
 
        dtWochenplan = New DataTable
        dtWochenplan.TableName = "Wochenplan"
 
        Dim keys(1) As DataColumn
        Dim column As New DataColumn
        column.DataType = System.Type.GetType("System.Int32")
        With column
            .ColumnName = "ID"
            .AutoIncrement = True
            .AutoIncrementStep = 1
        End With
        dtWochenplan.Columns.Add(column)
        keys(0) = column
        dtWochenplan.PrimaryKey = keys
 
        column = New DataColumn
        column.DataType = System.Type.GetType("System.String")
        column.ColumnName = "Name"
        dtWochenplan.Columns.Add(column)
 
        column = New DataColumn
        column.DataType = System.Type.GetType("System.String")
        column.ColumnName = "Tag"
        dtWochenplan.Columns.Add(column)
 
    End Sub
 
    Private Sub DataGridView1Initialisieren()
        With DataGridView1
            .DataSource = dtWochenplan
            .ReadOnly = False
            .AllowUserToAddRows = True
            .AllowUserToDeleteRows = False
            .SelectionMode = DataGridViewSelectionMode.FullRowSelect
            .MultiSelect = False
            .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
            .ScrollBars = ScrollBars.Both
            .RowsDefaultCellStyle.BackColor = Color.White
            .AlternatingRowsDefaultCellStyle.BackColor = Color.AliceBlue
        End With
    End Sub
 
    Private Sub DataGridView1_CellMouseDown(sender As Object, e As _
      DataGridViewCellMouseEventArgs) Handles DataGridView1.CellMouseDown
        c = e.ColumnIndex
        r = e.RowIndex
    End Sub
 
    Dim r As Integer = 0
    Dim c As Integer = 0
 
    Private Sub DataGridView1_MouseClick(sender As Object, e As MouseEventArgs) _
      Handles DataGridView1.MouseClick
 
        If e.Button = MouseButtons.Left Or c <> 1 Then
            Exit Sub
        End If
 
        DataGridView1.CurrentCell = DataGridView1(c, r)
        DataGridView1.BeginEdit(True)
 
        Dim MouseLeft As Integer = MousePosition.X
        Dim MouseTop As Integer = MousePosition.Y
 
        Dim f2 As New Form2
        f2.StartPosition = FormStartPosition.Manual
        f2.Left = MouseLeft
        f2.Top = MouseTop
 
        f2.ShowDialog()
 
        Dim Rueckgabe As String = f2.Nachname
 
        DataGridView1.CurrentCell.Value = Rueckgabe
 
        DataGridView1.EndEdit(True)
 
    End Sub
 
 
End Class
Public Class Form2
 
    Public Nachname As String
    Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        With ComboBox1
            .Items.Add("Müller")
            .Items.Add("Schmidt")
            .Items.Add("Meier")
        End With
    End Sub
 
    Private Sub btnOK_Click(sender As Object, e As EventArgs) Handles _
      btnOK.Click
        Nachname = ComboBox1.Text
        Me.Close()
    End Sub
End Class

EALA FREYA FRESENA

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zellen einer DGV mit Auswahllisten versehen 
Autor: woha
Datum: 13.10.20 08:32

Hallo effeff,



super und ein recht herzliches Dankeschön für Deinen Hinweis.
Ich hatte schon befürchtet, dass es in diese Richtung gehen muss (hatte dies in meinen alten vb6 Programmen für MSFlexGrids ähnlich gelöst), dachte aber, dass die neuen Controls doch irgendwie einen eleganteren Weg anbieten könnten.

Ich werde, mir Dein Beispiel im Detail ansehen (habe sofort ein paar tolle Hinweise und Tricks gesehen);
und melde mich, sobald ich es einigermaßen umgesetzt habe.

Ich denke, für die Listeninhalte wäre ein extra XML File besser geeignet, das ich dann gleich gesamt via ReadXML in ein Dataset einlesen werde.

Bis dahin dann schon ein nochmaliges DANKE

mfg
Wolfgang
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2020 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel