Hallo Zusammen,
zuerst mal vorweg, es ist das ERSTE MAL, dass ich mich innerhalb eines Forums bezüglich Probleme/Fragen zu Programmieren/Datenbanken wende.
Habt ein wenig nachsicht, wenn ich mich evtl. unklar ausdrücke oder bei beantworteten Sachen nicht direkt antworte (Familie hat bei mir immernoch vorrang )
So wo das geklärt ist, kommen wir zu meinem Anliegen:
Ich habe ein bisher kleines "Tool" welches sich aber WEIT vergrößern soll, sobald ich das Problem lösen kann, Grundlegend könnte man sagen es ist ein ToDo/Aufgaben Programm, welches aber im späteren Verlauf auch eine Art Ticketsystem (Ähnlich zu Jira z.B.) bekommen soll. Aber soweit ist es noch nicht. Zu Anfang meldet sich jeder erstmal an und dafür habe ich bisher in VB einen Anmeldebildschirm gebastelt, sieht so aus -> Siehe Bild Anmeldefenster.jpg
Dieses Anmeldefenster meldet den Benutzer (Je nachdem wer es ist) an einer MySQL Datenbank im Remoteverfahren an.
Datenbank liegt mittels Portweiterleitung im Internet. Die Version von MySQL ist 5.5, falls das wichtig ist.
Nachdem sich User oder Admin angemeldet hat, hat man eine Art Menü für (später irgendwann) mehrere Tabellen/Funktionen.
In diesem Fall nehmen wir als Beispiel mal die Personal Tabelle, wo 2-3 User neues Personal in einem Unternehmen anlegen können. Form -> Siehe Bild PersonalFenster.jpg
Die Linken TextBoxen ignorieren wir vorerst (Habe zuerst mit der ListView Option gebaut).
Hier mal der Code den ich bisher in der Personalform habe:
Wie man sieht, ich habe ein paar Sachen bisher ausprobiert (Siehe auskommentierte Zeilen).
Mein Problem ist nur, entweder es muss ein Aktualisieren Button gedrückt werden, um das DataGridView aktuell zu halten oder ich brauche einen Timer, der aber beim Aktualisieren nicht jedesmal los meckert, dass bei der Eingabe von neuem Personal kein "NULL" zulässig ist.
Die Daten, die ich im BindingSource eingebe, werden, man glaubt es kaum, direkt ins DataSet geschrieben. Dies konnte ich anhand des ersten Test's mit dem Timer beim Verändern der bereits eingetragenen Daten erkennen, dass der Timer direkt aktualisiert hat. Das geht allerdings nicht, wenn man neues Personal anlegt, da das Dataset ja dann direkt erstmal eine "NULL" Zeile erhält und sobald der Timer durchläuft erkennt er Fehleingaben.
Folgendes ist für mich wichtig, bzw. würde ich gerne erreichen: Eine Automatische aktualisierung des DataGridViews, sobald ein User eine Zeile einträgt, sodass auch alle anderen Benutzer des Tools erkennen "Aha, da ist was eingetragen worden, bzw. ah, der Kollege X hat bereits den neuen Kollegen Y angelegt". Im Idealfall (Für Technisch unbegabte Mitarbeiter) ohne einen Akualisierungsbutton. Halt Automatisch.
Meine Frage an euch ist jetzt, gibt es eine Methode, wo sowas möglich ist? Ich habe bereits dutzende Stunden im Netz mit der Suche verbracht und muss jetzt einfach hier fragen, so unangenehm wie es mir auch ist, weil ich die befürchtung habe, dass es sowas ganz banales ist, wo ich aber nicht drauf gekommen bin.
Ich danke euch schon mal im Voraus und entschuldige mich, falls einiges an Text hier total unnötig ist.
Gruß Dennis
EDIT: Ich vergaß eine Frage: Wo liegt eigentlich der Unterschied zwischen DataGridView.Refresh() und Me.PersonalDataTable.Update(...)??
zuerst mal vorweg, es ist das ERSTE MAL, dass ich mich innerhalb eines Forums bezüglich Probleme/Fragen zu Programmieren/Datenbanken wende.
Habt ein wenig nachsicht, wenn ich mich evtl. unklar ausdrücke oder bei beantworteten Sachen nicht direkt antworte (Familie hat bei mir immernoch vorrang )
So wo das geklärt ist, kommen wir zu meinem Anliegen:
Ich habe ein bisher kleines "Tool" welches sich aber WEIT vergrößern soll, sobald ich das Problem lösen kann, Grundlegend könnte man sagen es ist ein ToDo/Aufgaben Programm, welches aber im späteren Verlauf auch eine Art Ticketsystem (Ähnlich zu Jira z.B.) bekommen soll. Aber soweit ist es noch nicht. Zu Anfang meldet sich jeder erstmal an und dafür habe ich bisher in VB einen Anmeldebildschirm gebastelt, sieht so aus -> Siehe Bild Anmeldefenster.jpg
Dieses Anmeldefenster meldet den Benutzer (Je nachdem wer es ist) an einer MySQL Datenbank im Remoteverfahren an.
VB.NET-Quellcode
- Imports MySql.Data.MySqlClient
- Public Class Form1
- Private Sub LinkLabel1_LinkClicked(sender As Object, e As LinkLabelLinkClickedEventArgs) Handles LinkLabel1.LinkClicked
- System.Diagnostics.Process.Start("mailto:dennis@fahrdienst-rhein-main.de")
- End Sub
- Private Sub OK_Click(sender As Object, e As EventArgs) Handles OK.Click
- con = NewCon
- con.ConnectionString = "server=123456789url.de;userid=user;password=passwort;database=ramar;SslMode=none"
- Try
- con.Open()
- Dim Query As String
- Query = "select * from ramar.user where username='" & usertextbox.Text & "' and password='" & passwordtextbox.Text & "' "
- cmd = New MySqlCommand(Query, con)
- con.Close()
- Catch ex As MySqlException
- MessageBox.Show(ex.Message)
- Finally
- con.Dispose()
- End Try
- If usertextbox.Text = "User1" And passwordtextbox.Text = "Passwort" Then
- Call Ralf()
- ElseIf usertextbox.Text = "User2" And passwordtextbox.Text = "Passwort" Then
- Call Kristin()
- ElseIf usertextbox.Text = "User3" And passwordtextbox.Text = "passwort" Then
- Call Vera()
- ElseIf usertextbox.Text = "User4" And passwordtextbox.Text = "passwort" Then
- Call Hasan()
- ElseIf usertextbox.Text = "UserA" And passwordtextbox.Text = "passwort" Then
- Call Admin()
- ElseIf usertextbox.Text = "" Or passwordtextbox.Text = "" Then
- MsgBox("Benutzer- und Passwortfeld dürfen nicht leer sein!", MsgBoxStyle.Critical, "ACHTUNG!!!")
- Else
- MsgBox("Falscher Benutzername oder Passwort!", MsgBoxStyle.Critical, "ACHTUNG!!!")
- End If
- End Sub
- Private Sub UserA()
- UserAForm.Show()
- Me.Hide()
- End Sub
- Private Sub User1()
- User1Form.Show()
- Me.Hide()
- End Sub
- Private Sub User2()
- User2Form.Show()
- Me.Hide()
- End Sub
- Private Sub User3()
- User3Form.Show()
- Me.Hide()
- End Sub
- Private Sub User4()
- User4Form.Show()
- Me.Hide()
- End Sub
- Private Sub Cancel_Click(sender As Object, e As EventArgs) Handles Cancel.Click
- Me.Close()
- End Sub
- End Class
Datenbank liegt mittels Portweiterleitung im Internet. Die Version von MySQL ist 5.5, falls das wichtig ist.
Nachdem sich User oder Admin angemeldet hat, hat man eine Art Menü für (später irgendwann) mehrere Tabellen/Funktionen.
In diesem Fall nehmen wir als Beispiel mal die Personal Tabelle, wo 2-3 User neues Personal in einem Unternehmen anlegen können. Form -> Siehe Bild PersonalFenster.jpg
Die Linken TextBoxen ignorieren wir vorerst (Habe zuerst mit der ListView Option gebaut).
Hier mal der Code den ich bisher in der Personalform habe:
VB.NET-Quellcode
- Imports MySql.Data.MySqlClient
- Public Class PersonalForm
- ''Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
- ''Try
- 'FALSCH -> sql = "INSERT INTO 'ramar'.'Personal'('Vorname','Nachname','Abteilung','E-Mail','Telefon') VALUES('" & TextBox1.Text & "','" & TextBox2.Text & "','" & TextBox3.Text & "','" & TextBox4.Text & "','" & TextBox5.Text & "')"
- 'RICHTIG v'
- '' sql = "INSERT INTO `ramar`.`Personal` (`Vorname`, `Nachname`, `Abteilung`, `E-Mail`, `Telefon`) VALUES ('" & TextBox1.Text & "','" & TextBox2.Text & "','" & TextBox3.Text & "','" & TextBox4.Text & "','" & TextBox5.Text & "')"
- 'ConnectionRoot()
- '' cmd = New MySqlCommand(sql, NewCon)
- '' cmd.ExecuteNonQuery()
- '' MsgBox("Person angelegt")
- ''Catch ex As Exception
- '' MsgBox(ex.Message)
- ''Finally
- '' cmd.Dispose()
- '' NewCon.Close()
- '' End Try
- 'Me.PersonalTableAdapter.Fill(Me.RamarData.Personal)
- '' End Sub
- Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
- Me.Close()
- End Sub
- Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
- TextBox1.Text = ""
- TextBox2.Text = ""
- TextBox3.Text = ""
- TextBox4.Text = ""
- TextBox5.Text = ""
- End Sub
- 'Private Sub PersonalBindingNavigatorSaveItem_Click(sender As Object, e As EventArgs)
- 'Me.Validate()
- 'Me.PersonalBindingSource.EndEdit()
- 'Me.PersonalTableAdapter.Update(Me.RamarData.Personal)
- 'End Sub
- Private Sub PersonalForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- 'TODO: Diese Codezeile lädt Daten in die Tabelle "RamarData.Personal". Sie können sie bei Bedarf verschieben oder entfernen.
- Me.PersonalTableAdapter.Fill(Me.RamarData.Personal)
- 'Me.PersonalDataGridView.DataSource = Me.RamarData.Personal
- 'Me.PersonalDataGridView.Refresh()
- If RamarData.HasChanges(DataRowState.Added) Then
- Me.Validate()
- PersonalBindingSource.EndEdit()
- Me.PersonalTableAdapter.Update(Me.RamarData.Personal)
- End If
- If RamarData.HasChanges(DataRowState.Deleted) Then
- Me.Validate()
- PersonalBindingSource.EndEdit()
- Me.PersonalTableAdapter.Update(Me.RamarData.Personal)
- End If
- If RamarData.HasChanges(DataRowState.Modified) Then
- Me.Validate()
- PersonalBindingSource.EndEdit()
- Me.PersonalTableAdapter.Update(Me.RamarData.Personal)
- End If
- Timer1.Start()
- 'If Me.InvokeRequired Then
- 'Me.Invoke(Sub() 'lampda
- 'End Sub)
- 'Else
- 'End If
- End Sub
- Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
- Me.Validate()
- PersonalBindingSource.EndEdit()
- Me.PersonalTableAdapter.Update(Me.RamarData.Personal)
- End Sub
- Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
- Me.PersonalDataGridView.DataSource = Me.RamarData.Personal
- Me.PersonalDataGridView.Refresh()
- End Sub
- Private Sub PersonalDataGridView_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles PersonalDataGridView.CellContentClick
- End Sub
- Private Sub ButtonNew_Click(sender As Object, e As EventArgs) Handles ButtonNew.Click
- PersonalBindingSource.AddNew()
- End Sub
- 'Private Sub Tableupdate()
- 'If RamarData.HasChanges(DataRowState.Added) Then
- ' New rows have been added to the dataset, add appropriate code.
- 'Else
- ' No new rows have been added to the dataset, add appropriate code.
- 'End If
- 'End Sub
- End Class
Wie man sieht, ich habe ein paar Sachen bisher ausprobiert (Siehe auskommentierte Zeilen).
Mein Problem ist nur, entweder es muss ein Aktualisieren Button gedrückt werden, um das DataGridView aktuell zu halten oder ich brauche einen Timer, der aber beim Aktualisieren nicht jedesmal los meckert, dass bei der Eingabe von neuem Personal kein "NULL" zulässig ist.
Die Daten, die ich im BindingSource eingebe, werden, man glaubt es kaum, direkt ins DataSet geschrieben. Dies konnte ich anhand des ersten Test's mit dem Timer beim Verändern der bereits eingetragenen Daten erkennen, dass der Timer direkt aktualisiert hat. Das geht allerdings nicht, wenn man neues Personal anlegt, da das Dataset ja dann direkt erstmal eine "NULL" Zeile erhält und sobald der Timer durchläuft erkennt er Fehleingaben.
Folgendes ist für mich wichtig, bzw. würde ich gerne erreichen: Eine Automatische aktualisierung des DataGridViews, sobald ein User eine Zeile einträgt, sodass auch alle anderen Benutzer des Tools erkennen "Aha, da ist was eingetragen worden, bzw. ah, der Kollege X hat bereits den neuen Kollegen Y angelegt". Im Idealfall (Für Technisch unbegabte Mitarbeiter) ohne einen Akualisierungsbutton. Halt Automatisch.
Meine Frage an euch ist jetzt, gibt es eine Methode, wo sowas möglich ist? Ich habe bereits dutzende Stunden im Netz mit der Suche verbracht und muss jetzt einfach hier fragen, so unangenehm wie es mir auch ist, weil ich die befürchtung habe, dass es sowas ganz banales ist, wo ich aber nicht drauf gekommen bin.
Ich danke euch schon mal im Voraus und entschuldige mich, falls einiges an Text hier total unnötig ist.
Gruß Dennis
EDIT: Ich vergaß eine Frage: Wo liegt eigentlich der Unterschied zwischen DataGridView.Refresh() und Me.PersonalDataTable.Update(...)??
Programmieren sollte für Personen, die was ordentliches machen wollen, eine Leidenschaft sein. Ansonsten entsteht nur Müll und davon haben wir bereits genug in der Gesellschaft.