| |
VB.NET - FortgeschritteneRe: wie wird das gemacht? | | | Autor: Kuno60 | Datum: 28.10.18 12:29 |
| Hallo erbru,
das ist nicht schwer nachzubasteln.
Erstelle eine Klasse mit den nötigen Eigenschaften (Text, Datum/Zeit).
Erstelle für jede neue Notiz/Aufgabe eine GroupBox per Code und die Steuerelemente, die auf der GroupBox platziert werden (1x TextBox, 2x DateTimePicker, 3x Button und Labels). Die GroupBox dann einem FlowLayoutPanel zuweisen. Die Steuerelemente an die Klasse binden. Die Liste mit den Daten dann über Serialisierung speichern. Noch etwas Code für die Buttons schreiben... und fertig ist der Notizblock. | |
Re: wie wird das gemacht? | | | Autor: ERBRU | Datum: 28.10.18 12:42 |
| mach doch bitte ein Beispiel.
Danke! | |
Re: wie wird das gemacht? | | | Autor: Manfred X | Datum: 28.10.18 14:30 |
| Hallo!
Wie wird das gemacht?
1. Man formuliert eine aussagekräftige Überschrift für das Thema
2. Man verwendet für triviale Fragen das Einsteigerforum
3. Man stellt konkrete Fragen zu den Punkten, an denen man
nicht weiter kommt
4. Erstelle ein UserControl, das auf der Oberfläche die entsprechenden
Controls enthält, als Control-Container nutze z.B. ein TableLayoutPanel.
5. Verwende in der Anwendung eine Liste dieses UserControls | |
Re: wie wird das gemacht? | | | Autor: Franki | Datum: 29.10.18 01:40 |
| Hallo,
hast du schon mal mit einer Datenbank gearbeitet?
Weißt du wie man zu einer Tabelle neue Datensätze hinzufügt, bestehende bearbeitet, Daten löschen kann usw.?
Das Formular ist simpel, Textfeld, Datum/Uhrzeit und Schaltflächen. Wie du das optisch gestaltest ist wahrscheinlich nicht deine Frage denn die Funktion dahinter ist ja das Entscheidende.
Dieses Form für die Eingabe von Daten ist auch nichts Besonderes, solche Sachen hat jedes Eingabeformular einer Datenbank, oder Software die auf irgendwelche Daten zugreifen muss. So was konnte man schon mit Excel95 in VBA machen, wenn auch optisch nicht so schön aber von der Funktion her identisch.
Also worum geht es dir? Möchtest du wissen wie man so ein Formular erstellt oder auch wie du dessen Funktionalität realisieren kannst. Wenn letzteres wird es schwierig das mit ein paar Sätzen zu beantworten, da wäre in der Tat das Erlernen von Grundlagen über Daten(banken) erforderlich.
Gruß
Frank | |
Re: wie wird das gemacht? | | | Autor: Franki | Datum: 29.10.18 01:44 |
| Hallo,
noch ein kleiner Nachtrag.
Du schreibst, dass du das in eine bestehende Anwendung von dir einbauen möchtest.
Um was handelt es sich denn da? Vielleicht kann man dir besser helfen wenn du etwas genauer beschreibst was du programmierst und was von deinem Beispiel du übernehmen möchtest. Vielleicht liegen wir ja auch völlig falsch mit unseren Vrmutungen aufgrund deiner zu allgemeinen Fragestellung.
Gruß
Frank | |
Re: wie wird das gemacht? | | | Autor: ERBRU | Datum: 29.10.18 09:27 |
| Ja ihr habt alle samt Recht.
Franki, warum ich das mache. weil es mich interessiert wie man so etwas realisiert. Eine DGV zeigt einem die DZ so nicht an, und ich habe etwas mehr Platz auf meiner kleinen Form.
und ja eigentlich ist es relativ simple.
ein bisschen Code als Beispiel wie ich es nun probiert habe.
liege ich Richtig? zumindest funktioniert es.
die GroupBox erhält die DatensatzID "als Text" mit jedem AddNew wird ein UC-Control hinzugefügt.
Daten eingeben speichern, oder eben bearbeiten.
bin ich auf dem richtigen Weg?
'Notizen laden
Private Sub btn_Neue_Notiz_anlegen_Click(sender As Object, e As EventArgs) _
Handles btn_Neue_Notiz_anlegen.Click
NotizenBindingSource.AddNew()
load_Notizen()
End Sub
Public Sub load_Notizen()
With pnl_Eingabe_Notizen
.SuspendLayout()
While .Controls.Count > 0
.Controls(0).Dispose()
End While
For Each drv In NotizenBindingSource
Dim ucl = New NotizUc With {.Dock = DockStyle.Top}
ucl.NotizenBindingSource.DataSource = NotizenBindingSource
.Controls.Add(ucl)
ucl.NotizenBindingSource.DataSource = drv
Next
.ResumeLayout()
End With
End Sub sieht dann so aus
https://picload.org/view/dcailddw/29-10-_2018_09-07-57.png.html
https://picload.org/view/dcaildol/29-10-_2018_09-09-07.png.html
Beitrag wurde zuletzt am 29.10.18 um 09:33:34 editiert. | |
Re: wie wird das gemacht? | | | Autor: ERBRU | Datum: 30.10.18 09:46 |
| hallo ManfredX,
Danke für dein Kommentar zum Thema. Hast ja Recht bisschen kompliziert wie ich das angegangen bin.
evtl. benötige ich doch Anfänger Hilfe, da ich mich hier sehr schwer tue.
ein UserContol habe ich erstellt. Das ging noch relativ einfach. Doch dann zu bl..!
Doch habe ich nun das Problem auf die Tabelle zuzugreifen um Beispielsweise den Datensatz zu speichern "Connection String" funktioniert nun nicht auf das UserControl?
4. Erstelle ein UserControl, das auf der Oberfläche die entsprechenden
Controls enthält, als Control-Container nutze z.B. ein TableLayoutPanel. habe da ein Panel auf meiner Form1 Register erstellt
5. Verwende in der Anwendung eine Liste dieses UserControls das verstehe ich nicht!
https://picload.org/view/dcapccar/30-10-_2018_09-34-14.png.html | |
Re: wie wird das gemacht? | | | Autor: ERBRU | Datum: 30.10.18 12:38 |
| Danke effeff,
doch ich glaube ich bin zu d---, meinen Gedanken umzusetzen.
die Alarmuhr ist ja nicht das gleiche was ich mčchte. | |
Re: wie wird das gemacht? | | | Autor: effeff | Datum: 30.10.18 13:01 |
| Die Alarmuhr ist nur ein Beispiel, anhand dessen Du sehen kannst, wie Du ein Benutzersteuerelement erstellst...
Du musst natürlich schon ein eigenes Steuerlement mit GroupBox, Textbox, etc. kreieren!
EALA FREYA FRESENA | |
Re: wie wird das gemacht? | | | Autor: ERBRU | Datum: 30.10.18 18:08 |
| habe da noch eine Frage wozu ist das überhaupt Gut (UserControl)?
ich habe es jetzt verworfen, und arbeite weiter mit meinen Standards DGV etc. da weiß ich halt das ich auf meine Tabellen zugreifen kann und ordentliches speichern in die selben ist gewährleistet. | |
Re: wie wird das gemacht? | | | Autor: effeff | Datum: 30.10.18 22:22 |
| OK, da Du noch nicht einmal verstanden hast, worum es bei einem UserControl eigentlich geht...
Ein GANZ EINFACHES Beispiel für diesen Thread für all diejenigen, die das interessiert...
Form1 ist gnadenlos in einer Größe von 806; 585.
Form 1 beinhaltet ein FlowLayoutPanel namens FlowLayoutPanel1 an der Position: 12; 12, in der Größe 766; 473.
Weiterhin befindet sich ein Button namens Button1 an der Position 12;500 in der Größe 210; 34.
Und ein Button namens Button2 an der Position 568; 500 und der Größe 210; 34.
Der Code von Form1 folgt im nächsten Posting, da der Platz nicht ausreicht.
Es werden die Daten in eine XML gespeichert und von dort aus auch wieder hergestellt. Wie Du das an eine Datenbank bindest ist Dein Problem!
EALA FREYA FRESENA | |
Das nächste Posting... | | | Autor: effeff | Datum: 30.10.18 22:23 |
| m.ComponentModel
Public Class Form1
Dim Speichern As Boolean = False
Dim dt1 As New DataTable
Dim id As Integer = 0
Dim XMLPath As String = ""
Dim XMLFile As String = ""
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
AddControls("", "", "")
Speichern = True
End Sub
Private Sub BTN1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Dim btn As Button = sender
MessageBox.Show("Button " & btn.Name)
End Sub
Private Sub BTN2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Dim btn As Button = sender
MessageBox.Show("Button " & btn.Name)
End Sub
Private Sub BTN3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Dim btn As Button = sender
'MessageBox.Show("Button " & btn.Name & " " & btn.Parent.Name)
FlowLayoutPanel1.Controls.Remove(btn.Parent)
Speichern = True
End Sub
Private Sub dt1Initialisieren()
With dt1
With dt1
Dim IDCol As DataColumn = dt1.Columns.Add("ID", Type.GetType("System.Int32"))
IDCol.AllowDBNull = False
IDCol.Unique = True
IDCol.AutoIncrement = True
.Columns.Add("Aufgabe", Type.GetType("System.String"))
.Columns.Add("Datum", Type.GetType("System.String"))
.Columns.Add("Zeit", Type.GetType("System.String"))
.TableName = "Aufgaben"
End With
End With
Dim primaryKey(1) As DataColumn
primaryKey(1) = dt1.Columns("ID")
dt1.PrimaryKey = primaryKey
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
XMLPath = System.IO.Path.Combine(Environment.GetEnvironmentVariable("appdata"), "Aufgaben")
If Not System.IO.Directory.Exists(XMLPath) Then
System.IO.Directory.CreateDirectory(XMLPath)
End If
XMLFile = System.IO.Path.Combine(XMLPath, "Aufgaben.xml")
dt1Initialisieren()
LoadXML()
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
WriteXML()
End Sub
Private Sub WriteXML()
If dt1.Rows.Count > 0 Then
dt1.Clear()
End If
Dim cName As String = ""
Dim tbName As String = ""
Dim dtName As String = ""
Dim ttName As String = ""
For Each ctrl As Control In FlowLayoutPanel1.Controls
If TypeOf (ctrl) Is GroupBox Then
cName = ctrl.Name
tbName = cName.Replace("GB", "TB")
dtName = cName.Replace("GB", "DT")
ttName = cName.Replace("GB", "TT")
Dim newRow As DataRow = dt1.NewRow
newRow("Aufgabe") = ctrl.Controls(tbName).Text
newRow("Datum") = ctrl.Controls(dtName).Text
newRow("Zeit") = ctrl.Controls(ttName).Text
dt1.Rows.Add(newRow)
'MessageBox.Show(ctrl.Controls(tbName).Text & "/" & ctrl.Controls(dtName).Text & "/" & ctrl.Controls(ttName).Text)
End If
Next
dt1.WriteXml(XMLFile)
Speichern = False
End Sub
Teil 2 folgt nach!
EALA FREYA FRESENA | |
Und Teil 2... | | | Autor: effeff | Datum: 30.10.18 22:23 |
| Private Sub LoadXML()
Try
dt1.ReadXml(XMLFile)
Catch ex As Exception
End Try
If dt1.Rows.Count > 0 Then
For Each r As DataRow In dt1.Rows
AddControls(r("Aufgabe"), r("Datum"), r("Zeit"))
Next
End If
End Sub
Private Sub AddControls(ByVal TBText As String, ByVal dtText As String, ByVal ttText As String)
id += 1
Dim gb As New GroupBox
With gb
.Name = "GB" & id
.Size = New Size(724, 85)
'.Location = New Point(12, 16 + 91 * (i - 1))
.Text = id
.Visible = True
End With
FlowLayoutPanel1.Controls.Add(gb)
Dim tb As New TextBox
With tb
.Name = "TB" & id
.Size = New Size(345, 50)
.Location = New Point(6, 19)
.Multiline = True
.Visible = True
.Text = TBText
End With
gb.Controls.Add(tb)
Dim dt As New DateTimePicker
With dt
.Name = "DT" & id
.Size = New Size(189, 20)
.Location = New Point(357, 19)
.Visible = True
.Text = dtText
End With
gb.Controls.Add(dt)
Dim tt As New DateTimePicker
With tt
.Name = "TT" & id
.Size = New Size(189, 20)
.Location = New Point(357, 49)
.Format = DateTimePickerFormat.Time
.ShowUpDown = True
.Visible = True
.Text = ttText
End With
gb.Controls.Add(tt)
Dim btn1 As New Button
With btn1
.Name = "BTN1_" & id
.Size = New Size(50, 50)
.Location = New Point(552, 19)
.Image = WindowsApplication1.My.Resources.Resources.apfel_1
.Visible = True
End With
gb.Controls.Add(btn1)
AddHandler btn1.Click, AddressOf Me.BTN1_Click
Dim btn2 As New Button
With btn2
.Name = "BTN2_" & id
.Size = New Size(50, 50)
.Location = New Point(608, 19)
.Image = WindowsApplication1.My.Resources.Resources.kanne_1
.Visible = True
End With
gb.Controls.Add(btn2)
AddHandler btn2.Click, AddressOf Me.BTN2_Click
Dim btn3 As New Button
With btn3
.Name = "BTN2_" & id
.Size = New Size(50, 50)
.Location = New Point(664, 19)
.Image = WindowsApplication1.My.Resources.Resources.miezi_1
.Visible = True
End With
gb.Controls.Add(btn3)
AddHandler btn3.Click, AddressOf Me.BTN3_Click
End Sub
Private Sub Form1_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing
If Speichern = True Then
Dim res As DialogResult = MessageBox.Show("Möchten Sie die Änderungen speichern?", "Hinweis:", MessageBoxButtons.YesNo)
If res = DialogResult.Yes Then
WriteXML()
End If
End If
End Sub
End ClassEALA FREYA FRESENA | |
Re: wie wird das gemacht? | | | Autor: effeff | Datum: 03.11.18 10:35 |
| Ein UserControl ist dazu da, für wiederkehrende Aufgaben ein fertiges Rezept zu haben. In Deinem Fall benötigst Du eine GroupBox mit einer TextBox, DateTimePicker, etc. Um das Arbeiten damit zu vereinfachen, erstellt man selber ein komplettes Control und verwendet dann eben dieses immer wieder.
EALA FREYA FRESENA | |
Re: wie wird das gemacht? | | | Autor: Franki | Datum: 04.11.18 03:11 |
| Hallo,
du hast ja recht, aber in diesem Fall würde ich von einem UserControl abraten, da beim Fragesteller halt nicht klar ist wie er das machen kann. Und bei diesem Beispiel würde das UserControl sowieso nur Standardsteuerelemente enthalten die keiner besonderen Behandlung unterzogen werden müssten.
Und das mit dem "wiederkehrenden Reszept" scheint mir hier auch nicht gegeben zu sein, es geht erst mal wohl nur darum die gestellte Aufgabe zu lösen. Da ist ein UserControl erst mal ein Hindernis und eigentlich nicht nötig.
Wenn fortgeschrittene Programmierung angesagt ist, dann ist ein UC praktisch besonders weil man dort Sachen unterbringen kann die die Standards nicht bieten. Und genau dafür ist meiner Meinugn nach ein UC gedacht, dass es einen Mehrwert bietet. Das Auslesenen der Eingabe einer Textbox odhen weiter Verarbeitung kann auch über die Textbox selbst gemacht werden, dafür braucht man kein UC
Gruß
Frank | |
Re: wie wird das gemacht? | | | Autor: effeff | Datum: 04.11.18 10:37 |
| //du hast ja recht, aber in diesem Fall würde ich von einem UserControl abraten, da beim Fragesteller halt nicht klar ist wie er das machen kann. Und bei diesem Beispiel würde das UserControl sowieso nur Standardsteuerelemente enthalten die keiner besonderen Behandlung unterzogen werden müssten.//
Der Fragesteller hat in einem mehrteiligen Post von mir explizit eine Lösung ohne UserControl erhalten...
Siehe https://www.vbarchiv.net/forum/id10_i76471t76457_wie-wird-das-gemacht.html und die beiden darauf folgenden Posts...
//Und das mit dem "wiederkehrenden Reszept" scheint mir hier auch nicht gegeben zu sein, es geht erst mal wohl nur darum die gestellte Aufgabe zu lösen. Da ist ein UserControl erst mal ein Hindernis und eigentlich nicht nötig.//
Es wird bis zu n mal eine Möglichkeit benötigt, eine GroupBox mit darin TextBox, zwei DateTimePickern, drei Buttons und vielleicht noch eigene Controls einzufügen. Da finde ich das UC doch schon die erste Wahl. Der Weg ohne UC ist oben beschrieben.
//Wenn fortgeschrittene Programmierung angesagt ist, dann ist ein UC praktisch besonders weil man dort Sachen unterbringen kann die die Standards nicht bieten. Und genau dafür ist meiner Meinugn nach ein UC gedacht, dass es einen Mehrwert bietet. Das Auslesenen der Eingabe einer Textbox odhen weiter Verarbeitung kann auch über die Textbox selbst gemacht werden, dafür braucht man kein UC //
Sicherlich... Früher hat man auch Schlitten benutzt, um Sachen zu transportieren; Doch die Sache mit den Rädern hat sich dann als wirksamer erwiesen...
EALA FREYA FRESENA | |
Re: Und Teil 2... | | | Autor: ERBRU | Datum: 04.11.18 12:48 |
| hier der Nachbau wie du es beschrieben hast.
aber ich kann nicht nachvollziehen wie die TB zum Beispiel editiert werden kann, um die zu bearbeiten.
das heißt muss die tb nicht enable false gesetzt werden nach dem speichern?
und eine Aufgabe als erledigt abhaken ? damit Anwender weiß was abgearbeitet ist.
also an ein Dataset lässt sich das nicht binden? lassen sich UC auch filtern zum Beispiel nach Datum, Woche oder so?
https://picload.org/view/dcorowww/04-11-_2018_12-28-57.png.html | |
Re: wie wird das gemacht? | | | Autor: Kuno60 | Datum: 04.11.18 13:30 |
| Mit einem UserControl ist die Sache einfacher, da man auch eine BindingSource auf dem UC platzieren kann und dann die Steuerelemente (Textbox und DTP) an die BS binden kann. Die BS kann dann an eine Zeile der Datenquelle gebunden werden. So ist es einfacher Werte zu editieren und es ist kein zusätzlicher Code nötig. | |
Re: wie wird das gemacht? | | | Autor: ERBRU | Datum: 04.11.18 15:40 |
| kannste da bitte mal ein Beispiel geben?
Private Sub btn_Neue_Notiz_anlegen_Click(sender As Object, e As EventArgs) _
Handles btn_Neue_Notiz_anlegen.Click
AddControls("", "", "")
Speichern = True
End Sub
Private Sub BTN1_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs)
Dim btn As Button = sender
der soll dann editieren zum bearbeiten
End Sub
Private Sub BTN2_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs)
Dim btn As Button = sender
Dim Abfrage_Result As DialogResult = MessageBox.Show("Wollen Sie die" & _
"Notiz/Aufgabe speichern?", "Sicherheits-Abfrage", _
MessageBoxButtons.Yes_
No, _
MessageBoxIcon.Questi_
on, _
MessageBoxDefaultButt_
on.Button2)
If Abfrage_Result = System.Windows.Forms.DialogResult.No Then Return
DB_speichern()
_Anzahl()
End Sub
Private Sub BTN3_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs)
Dim btn As Button = sender
Dim Abfrage_Result As DialogResult = MessageBox.Show("Wollen Sie die" & _
"Notiz/Aufgabe entfernen?", "Sicherheits-Abfrage", _
MessageBoxButtons.Yes_
No, _
MessageBoxIcon.Questi_
on, _
MessageBoxDefaultButt_
on.Button2)
If Abfrage_Result = System.Windows.Forms.DialogResult.No Then Return
FlowLayoutPanel1.Controls.Remove(btn.Parent)
Speichern = True
End Sub
Private Sub btn_Speichern_Click(sender As Object, e As EventArgs) Handles _
btn_Speichern.Click
DB_speichern()
End Sub | |
Re: wie wird das gemacht? | | | Autor: Franki | Datum: 05.11.18 04:58 |
| Hallo,
richtig, das mit den Schlitten ist "Schnee" von gesternt, aber auch zheute gibt es noch Pferdeschlitten, Hundeschlitten usw. Ok ohne Schnee wird das nichts mehr, aber es gibt Schneekanonen...
Man muss ja auch nicht mit Kanonen auf Spatzen schiessen, das mag zwar wirkungsvoll sein und funktionieren...
Aber um bei diesem Beispiel zu bleiben ist ein UC hier nicht wirklich notwendig. Denn man muss erst mal die Grundlagen beherrchen, wenn dan das drauf hat, dann geht es an die Optimierung. Klar kann ein UC einen Mehrwert bieten, vielleicht sogar Performance usw. ABer in diesem Fall sieht das nicht so aus. Eher eine einfache Zielführung zur Lösung des Problems, aufrüsten kann man dann spter immer noch wenn es wirklich X fach gebraucht wird.
Wenn ich eine Kiste Wasser in die zweite Etage tragen muss kann ich natürlich auch einen Aufzug ins Haus einbauen... Wenn ich da oben jedoch einen Getränkehandel machen möchte würde sich das evtl. lohnen.
Gruß
Frank | |
Re: wie wird das gemacht? | | | Autor: effeff | Datum: 05.11.18 10:04 |
| Du hast einen Link erhalten, in welchem beschrieben steht, wie ein UserControl erstellt wird. Du brauchst doch nur anstelle des Labels mit seinen Eigenschaften eine entsprechende GroupBox erstellen, welche eine Textbox mit Label, zwei DateTimePicker, Buttons und was Du sonst noch so benötigst, enthält. Du benennst das Ganze nach Anleitung vom Link, erstellst die DLL und diese DLL fügst Du nachher in Deine Toolbox dazu (rechte Maustaste auf Toolbox, Elemente hinzufügen, durchsuchen, Deine DLL auswählen). Nun kannst Du das Control auf Deiner Form verwenden. Wie Kuno60 beschrieben hat bindest Du dann jeweils eine RowView an die Elemente und gut ist.
EALA FREYA FRESENA | |
| 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 |
|
|
sevAniGif (VB/VBA)
Anzeigen von animierten GIF-Dateien
Ab sofort lassen sich auch unter VB6 und VBA (Access ab Version 2000) animierte GIF-Grafiken anzeigen und abspielen, die entweder lokal auf dem System oder auf einem Webserver gespeichert sind. Weitere InfosTipp des Monats Access-Tools Vol.1
Über 400 MByte Inhalt
Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB
Nur 24,95 EURWeitere Infos
|