Ausgewählte DataRow in zweiter Form bearbeiten

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Fortender.

    Ausgewählte DataRow in zweiter Form bearbeiten

    Hallo,
    ich möchte den im DataGridView ausgewählten Eintrag in einer zweiten Form (Dialog) bearbeiten können.
    Selbstverständlich soll der Eintrag im Table geändert werden und nicht nur in der Ansicht.

    Mein Denkansatz:
    Da die BindingSource in der zweiten Form nicht mit dem DataGridView verknüpft ist, zeigt diese nicht auf den in
    der ersten Form ausgewählten Eintrag und ich würde nicht das gewünschte Ergebnis erhalten.
    Also muss ich der zweiten Form die nötigen Informationen übergeben, dass dies möglich wird, also vermutlich
    "BindingSource.Current". Das würde dann wohl bedeuten, dass in der zweiten Form eine BindingSource vorhanden ist,
    die diese Daten dann übernimmt und somit auch der DetailView der zweiten Form geupdated werden kann.

    Provisorisch könnte man ja auch einfach per Code den betreffenden Controls einfach die BindingSource der ersten Form
    zuweisen. Nur möchte ich es eben sauber coden. Da ich bei der Datenbankprogrammierung neu bin, habe ich auch keine
    Ahnung wie ich es anstelle, dass die Veränderungen die man in bspw. den Textboxen durchführt erst bestätigt werden müssen
    und nicht sofort übernommen werden, hab ich mir codetechnisch noch nichts überlegt bis auf ein paar Schnippsel.

    MfG Tim
    Ich hohle mir die Zeile und füge Datenbindungen hinzu, zwischen den Spalten der typisierten Zeile und den Controls.

    VB.NET-Quellcode

    1. Private Sub EditToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles EditToolStripMenuItem.Click
    2. Using Editor As New FRM_EDITOR()
    3. Dim drv As DataRowView = DirectCast(VideoBindingSource.Current(), DataRowView)
    4. Dim v As Videos.VideoRow = DirectCast(drv.Row, Videos.VideoRow)
    5. v.BeginEdit()
    6. Editor.NameTextBox.DataBindings.Add(New Binding("Text", v, "Name", False, DataSourceUpdateMode.OnPropertyChanged))
    7. Editor.FilePathTextBox.DataBindings.Add(New Binding("Text", v, "FilePath", False, DataSourceUpdateMode.OnPropertyChanged))
    8. Editor.TrackBarStars.DataBindings.Add(New Binding("Value", v, "Stars", False, DataSourceUpdateMode.OnPropertyChanged))
    9. Editor.GenreTextBox.DataBindings.Add(New Binding("Text", v, "Genre", False, DataSourceUpdateMode.OnPropertyChanged))
    10. Editor.ImagePathTextBox.DataBindings.Add(New Binding("Text", v, "ImagePath", False, DataSourceUpdateMode.OnPropertyChanged))
    11. Editor.DescriptionTextBox.DataBindings.Add(New Binding("Text", v, "Description", False, DataSourceUpdateMode.OnPropertyChanged))
    12. Editor.DurationTextBox.DataBindings.Add(New Binding("Text", v, "Duration", False, DataSourceUpdateMode.OnPropertyChanged))
    13. If Editor.ShowDialog() = Windows.Forms.DialogResult.OK Then
    14. v.EndEdit()
    15. Else
    16. v.CancelEdit()
    17. End If
    18. End Using
    19. End Sub

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Murdock“ ()

    @Murdock
    So ähnlich sah mein Ansatz auch aus. Funktioniert! Vielen Dank.
    Jetzt möchte ich, dass die Daten die in den Dialog geladen werden, aber auch formatiert werden.
    Also, dass bei ID=1 in meinem Label steht "001:". Jetzt könnte ich in dem TextChanged event einfach
    schreiben:

    VB.NET-Quellcode

    1. If Integer.TryParse(lAddr.Text, True) Then _
    2. lAddr.Text = String.Format("{0:000}:", Integer.Parse(lAddr.Text))​

    oder

    VB.NET-Quellcode

    1. ​If Integer.TryParse(lAddr.Text, True) Then _
    2. lAddr.Text = Integer.Parse(lAddr.Text).ToString("000:")


    Das scheint mir aber eher unsauber zu sein und außerdem wird doch dann ständig das TextChanged Event gecalled, oder nicht?
    Wie könnte ich das umgehen?

    Mfg Tim
    Ja da ist auch was machbar, gibt ja die möglichkeit Convertierungen zu erlauben, wie auch ein Format anzugeben. Dann solltest du aber auch unbedingt, eines der Key-Events der TextBox behandeln damit wirklich nur korrekte Werte entstehen können. Ich hab die ID als Nullwert gesetzt, wenn nicht-numerics im Text sind, wird diese wieder gesetzt.

    VB.NET-Quellcode

    1. 'DatabindingE
    2. Editor.TextBox1.DataBindings.Add(New Binding("Text", v, "Id", True, DataSourceUpdateMode.OnPropertyChanged, v.Id, "000"))

    VB.NET-Quellcode

    1. 'TextBox_KeyEvent
    2. Private Sub TextBox1_KeyUp(sender As Object, e As KeyEventArgs) Handles TextBox1.KeyUp
    3. Select Case True
    4. Case e.KeyCode >= Keys.D0 AndAlso e.KeyCode <= Keys.D9
    5. Case e.KeyCode >= Keys.NumPad0 AndAlso e.KeyCode <= Keys.NumPad9
    6. Case e.KeyCode = 8 OrElse e.KeyCode = 109 OrElse e.KeyCode = 189
    7. Case Else
    8. e.Handled = True
    9. End Select
    10. End Sub

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Murdock“ ()

    Murdock schrieb:

    Dann solltest du aber auch unbedingt, eines der Key-Events der TextBox behandeln damit wirklich nur korrekte Werte entstehen können

    Ich weiß nicht genau was du meinst. Die ID wird nur codeseitig behandelt und ist außerdem Read-Only. Außerdem wird sie im DetailView nur im Label
    dargestellt, da sie sowieso nicht verändert werden soll. Diese soll eben so angezeigt werden: "000:", "001:", ..., "999:" .
    Die Textboxen auf meiner Form die nur numerische Werte beinhalten dürfen werden schon so behandelt, dass auch nur numerische Werte vorkommen
    können.
    Dein Code funktioniert aber, vielen Dank!

    VB1963 schrieb:

    Das kann man über die ConvertEventArgs-Klasse abwickeln...

    Interessant! Kann man aber in dem Fall bequemer mit Murdock's Variante lösen. Trotzdem danke!

    Vielen Dank euch allen!

    MfG Tim
    STRG+V ist schonmal gar nicht möglich weil ich nur Zahlen und Backspace zulasse:

    VB.NET-Quellcode

    1. Private Sub tHi_KeyPress(sender As Object, e As KeyPressEventArgs) Handles tHi.KeyPress
    2. If Not "0123456789".Contains(e.KeyChar) And Not e.KeyChar = Chr(8) Then
    3. e.Handled = True
    4. End If
    5. End Sub

    Was noch möglich ist, ist das ContextMenu. Das kann man aber über die Property "ShortcutsEnabled = False" lösen.

    MfG Tim

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Fortender“ ()