Benutzer mit den meisten Antworten
CheckState bei Eigenem Control mitgeben

Frage
-
Hallo zusammen,
jatzt habe ich einen CheckButton gestaltet mit Ton und Hintergrundfarbe. Das geht auch alles soweit dank eurer Hilfe.
Aber wie kann ich die Eigenschaften
Checked
CheckState
dem UserControl mit auf dem weg geben.
So das ich diese später auch beeinflussen bzw. steuern kann.
Beispiel:
If Button.Checked = True Then
...
End Ifvielen lieben dank
Bernd
Antworten
-
Hallo ChaosBernd,
Habe im folgenden Beispiel eine CheckBoxWithValue erstellt die von System.Windows.Forms.CheckBox erbt.
Bei Form1_Load habe ich dann diesem Steuerelement ein paar Eigenschaften angegeben.
Nachher prüfe ich auf einem Knopf, mithilfe der CheckState Funktion, die Checked Eigenschaft von dieser CheckBoxWithValue.
Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim myCheck As New CheckBoxWithValue() myCheck.Value = True myCheck.Text = "ABCD" myCheck.Name = "MyCheckBox" myCheck.Checked = True Me.Controls.Add(myCheck) End Sub Friend Class CheckBoxWithValue Inherits System.Windows.Forms.CheckBox Private myValue As Object Public Property Value() As Object Get Return myValue End Get Set(ByVal value As Object) myValue = value End Set End Property End Class Private Function CheckedState(ByVal name As String) As Boolean For Each c As Control In Me.Controls If (c.Name = name) And (TypeOf c Is CheckBox) Then If DirectCast(c, CheckBox).Checked Then Return True Else Return False End If End If Next Return Nothing End Function Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click If CheckedState("MyCheckBox") Then MsgBox("Checked") Else MsgBox("Unchecked") End If End Sub End Class
Grüße,
Robert
- Als Antwort markiert Bernd Schlepütz Dienstag, 6. April 2010 16:23
-
Hallo Bernd,
wie Thorsten schon schrieb:
Wenn Du über ein UserControl gehst, mußt Du jede Eigenschaft und
auch Ereignisse nach aussen weiterleiten.Für die CheckBox wären das Checked + CheckedChanged bzw.
CheckState + CheckStateChanged.
Das könnte auf die beiden Eigenschaften reduziert wie folgt aussehen:Imports System.ComponentModel Public Class CheckedButton ' Inherits UserControl Private WithEvents checkBoxButton As System.Windows.Forms.CheckBox Public Sub New() InitializeComponent() ' Aus InitializeComponent zur Verdeutlichung Me.checkBoxButton = New System.Windows.Forms.CheckBox() ' 'checkBoxButton ' Me.checkBoxButton.Appearance = System.Windows.Forms.Appearance.Button Me.checkBoxButton.AutoSize = True Me.checkBoxButton.Dock = System.Windows.Forms.DockStyle.Fill Me.checkBoxButton.Location = New System.Drawing.Point(0, 0) Me.checkBoxButton.Name = "checkBoxButton" Me.checkBoxButton.Size = New System.Drawing.Size(120, 24) Me.checkBoxButton.TabIndex = 0 Me.checkBoxButton.UseVisualStyleBackColor = True Me.Controls.Add(Me.checkBoxButton) End Sub #Region "Checked Eigenschaft" ''' <summary> ''' Gibt an ob die Schaltfläche markiert ist. ''' </summary> ''' <remarks>Wird an die interne Schaltfläche weitergereicht.</remarks> <Category("CheckedButton"), _ RefreshProperties(RefreshProperties.All), Bindable(True), _ DefaultValue(False)> _ Public Property Checked() As Boolean Get Return Me.checkBoxButton.Checked End Get Set(ByVal value As Boolean) Me.checkBoxButton.Checked = value End Set End Property ''' <summary> ''' Tritt ein wenn sich die CheckedChange Eigenschaft ändert. ''' </summary> ''' <remarks> ''' Leitet das Ereignis an die interne Schaltfläche weiter. ''' </remarks> <Category("CheckedButton")> _ Public Custom Event CheckedChanged As EventHandler AddHandler(ByVal value As EventHandler) AddHandler Me.checkBoxButton.CheckedChanged, value End AddHandler RemoveHandler(ByVal value As EventHandler) RemoveHandler Me.checkBoxButton.CheckedChanged, value End RemoveHandler RaiseEvent(ByVal sender As Object, ByVal e As EventArgs) ' Do Nothing Visual Basic mag es nunmal nur so ' http://www.panopticoncentral.net/archive/2004/08/06/1545.aspx End RaiseEvent End Event #End Region #Region "CheckState Eigenschaft" ''' <summary> ''' Gibt den Status der Schaltfläche an. ''' </summary> ''' <remarks>Wird an die interne Schaltfläche weitergereicht.</remarks> <Category("CheckedButton"), _ RefreshProperties(RefreshProperties.All), Bindable(True), _ DefaultValue(CheckState.Unchecked)> _ Public Property CheckState() As System.Windows.Forms.CheckState Get Return Me.checkBoxButton.CheckState End Get Set(ByVal value As System.Windows.Forms.CheckState) Me.checkBoxButton.CheckState = value End Set End Property ''' <summary> ''' Tritt ein wenn sich die CheckedChange Eigenschaft ändert. ''' </summary> ''' <remarks> ''' Leitet das Ereignis an die interne Schaltfläche weiter ''' </remarks> <Category("CheckedButton")> _ Public Custom Event CheckStateChanged As EventHandler AddHandler(ByVal value As EventHandler) AddHandler Me.checkBoxButton.CheckStateChanged, value End AddHandler RemoveHandler(ByVal value As EventHandler) RemoveHandler Me.checkBoxButton.CheckStateChanged, value End RemoveHandler RaiseEvent(ByVal sender As Object, ByVal e As EventArgs) ' Do Nothing End RaiseEvent End Event #End Region End Class
Ich habe dabei die Eigenschaftswerte direkt an das zugrundeliegende Steuerelement weitergeleitet,
ebenso die Ereignisse via Custom Event.Gruß Elmar
- Als Antwort vorgeschlagen Robert BreitenhoferModerator Dienstag, 6. April 2010 12:43
- Als Antwort markiert Bernd Schlepütz Dienstag, 6. April 2010 16:23
Alle Antworten
-
Hallo ChaosBernd,
Habe im folgenden Beispiel eine CheckBoxWithValue erstellt die von System.Windows.Forms.CheckBox erbt.
Bei Form1_Load habe ich dann diesem Steuerelement ein paar Eigenschaften angegeben.
Nachher prüfe ich auf einem Knopf, mithilfe der CheckState Funktion, die Checked Eigenschaft von dieser CheckBoxWithValue.
Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim myCheck As New CheckBoxWithValue() myCheck.Value = True myCheck.Text = "ABCD" myCheck.Name = "MyCheckBox" myCheck.Checked = True Me.Controls.Add(myCheck) End Sub Friend Class CheckBoxWithValue Inherits System.Windows.Forms.CheckBox Private myValue As Object Public Property Value() As Object Get Return myValue End Get Set(ByVal value As Object) myValue = value End Set End Property End Class Private Function CheckedState(ByVal name As String) As Boolean For Each c As Control In Me.Controls If (c.Name = name) And (TypeOf c Is CheckBox) Then If DirectCast(c, CheckBox).Checked Then Return True Else Return False End If End If Next Return Nothing End Function Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click If CheckedState("MyCheckBox") Then MsgBox("Checked") Else MsgBox("Unchecked") End If End Sub End Class
Grüße,
Robert
- Als Antwort markiert Bernd Schlepütz Dienstag, 6. April 2010 16:23
-
Hallo Robert,
erstmal vielen dank. Aber so wie ich den Code lese steht er im Form1. Also schon im späteren Anwendungsprogramm.
Ich hatte vor einen Button zu basteln bei dem alle Eigenschaften fertig sind.
Wenn ich später beim programmieren den Aufwand wieder betreiben muss, macht es keinen Sinn.
Dann habe schneller eine CheckBox aus der ToolBox gezogen und das Designe angepasst.Was ich eigentlich meine ist, das ich das Control komplett fertig übergebe.
Also alle Eingenschaften vorab fertigstelle und dann mit auf dem weg gebe.
In meinem Beispiel war es eine CheckBox die ummodeliert wurde zu einem Button mit CheckStatus.
Nun könnte man ja auch andere Eigenschaften und Ereignisse mit auf dem Weg geben.
Thorsten hatte mir bereit geschrieben wie man das Click Ereignis mit auf dem Weg gibt.'Leitet nur ds Click Event des Button1 and die Form weiter Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.OnClick(e) End Sub
Und das wollte ich für z.B. den CheckState mit auf den Weg geben.
vielen dank
Bernd -
Hallo Bernd,
präziser beantworten liesse sich die Frage, wenn man die Art der Implementierung
besser kennen würde. Thorsten Dörfler hatte bereits in Click Event bei eigenen Controls
vorgeschlagen, direkt von Button (oder ButtonBase) abzuleiten, was ich dabei ebenfalls
tun würde - eine Standard CheckBox ist am Ende auch von Button abgeleitet.Hast Du über UserControl abgeleitet, so müsstest Du wie dort gezeigt,
alle Eigenschaften reflektieren bzw. neue dort einfügen, wo Du über den
Standard hinausgehst.Gruß Elmar
-
Ok,
vieleicht verstehe ich das ganze nur falsch.Imports System.ComponentModel <ToolboxBitmap(GetType(BS_CheckButton), "BS_CheckButton.bmp")> <DefaultEvent("Click")> Public Class BS_CheckButton '<ToolboxBitmap("C:\test.bmp")> '#Region "Antwort aus msdn" 'Leitet nur das Click Event des Button1 and die Form weiter Private Sub BS_Check_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BS_Check.Click Me.OnClick(e) End Sub ' ' Das erzeugt ein ButtonClick Event später in der Form ' 'In dem Formular hast Du dann für Dein UserControl ein zusätzliches Ereignis "ButtonClick" zur Auswahl, ' 'das nur beim Klicken auf den Button ausgelöst wird. ' 'Public Event ButtonClick As EventHandler ' 'Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' ' RaiseEvent ButtonClick(sender, e) ' 'End Sub '#End Region Dim PlaySound As Boolean = False Dim BagColor As Boolean = False Dim ChckStat As Boolean = True ''' <summary> ''' Check Changed ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> ''' <remarks></remarks> Private Sub BS_Check_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BS_Check.CheckedChanged Einstellen() Me.Invalidate() End Sub ''' <summary> ''' Load ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> ''' <remarks></remarks> Private Sub Haeckchen_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Me.Size = New Size(Me.Size.Width, Me.Size.Width) Einstellen() End Sub ''' <summary> ''' Einstellungen ''' </summary> ''' <remarks></remarks> Private Sub Einstellen() If PlaySound = True Then My.Computer.Audio.Play(My.Resources.Windows_Battery_Critical, AudioPlayMode.Background) End If Select Case BS_Check.CheckState Case CheckState.Checked ChSt = False BS_Check.BackgroundImage = My.Resources.apply BS_Check.CheckState = CheckState.Checked Select Case BagColor Case True BS_Check.FlatAppearance.CheckedBackColor = Color.Red Case False BS_Check.FlatAppearance.CheckedBackColor = Color.Transparent End Select Case CheckState.Unchecked ChSt = True BS_Check.BackgroundImage = My.Resources.x BS_Check.CheckState = CheckState.Unchecked Select Case BagColor Case True BS_Check.BackColor = Color.Green Case False BS_Check.BackColor = Color.Transparent End Select End Select End Sub ''' <summary> ''' Paint ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> ''' <remarks></remarks> Private Sub BS_Check_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles BS_Check.Paint Me.Size = New Size(Me.Size.Width, Me.Size.Width) Runden.abrunden(BS_Check, 0, 0, BS_Check.Width, BS_Check.Height, BS_Check.Width) End Sub ''' <summary> ''' Sound Effekt ein aus schalten ''' </summary> ''' <value></value> ''' <returns></returns> ''' <remarks></remarks> <Description("Sound Effect on Click, True or False"), Category("BS_CheckButton")> _ Public Property PlaySnd() As Boolean Get Return PlaySound End Get Set(ByVal value As Boolean) PlaySound = value End Set End Property ''' <summary> ''' Hintergrund Farbe ein aus schalten ''' </summary> ''' <value></value> ''' <returns></returns> ''' <remarks></remarks> <Description("Back Color, True or False"), Category("BS_CheckButton")> _ Public Property BaCo() As Boolean Get Return BagColor End Get Set(ByVal value As Boolean) BagColor = value End Set End Property ''' <summary> ''' Provisorium für der CheckStatus, welches auch später abgefragt werden kann. ''' ''' </summary> ''' <value></value> ''' <returns></returns> ''' <remarks></remarks> <Description("CheckState, True or False"), Category("BS_CheckButton")> _ Public Property ChSt() As Boolean Get Return ChckStat End Get Set(ByVal value As Boolean) ChckStat = value End Set End Property End Class
Das ist eine CheckBox, die Ansicht habe ich auf Button geändert. Dann mit Bilder, Hintegrundfarben und Ton versehen.
Das funktioniert alles.Public Class Form1 Private Sub BS_CheckButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BS_CheckButton1.Click ' Mit meinem Provisorium funktioniert auch die Abfrage. Einwandfrei If BS_CheckButton1.ChSt = True Then MessageBox.Show("nicht gecheckt") Else MessageBox.Show("gecheckt") End If End Sub Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load ' möchte aber nun hier den CheckStatus etzen, geht das nicht weil es ihn in den Eigenschaften garnicht gibt. End Sub End Class
Soweit sogut.
Jedoch möchte ich z.B. den CheckStatus haben.
Ich lesen mir die anderen Threads nochmal durch. Und auch die Beispiele von msdn und Gallileo.
Ich denke das ich da etwas falsch oder garnicht verstehen.
Danke
Bernd -
Hallo Bernd,
wie Thorsten schon schrieb:
Wenn Du über ein UserControl gehst, mußt Du jede Eigenschaft und
auch Ereignisse nach aussen weiterleiten.Für die CheckBox wären das Checked + CheckedChanged bzw.
CheckState + CheckStateChanged.
Das könnte auf die beiden Eigenschaften reduziert wie folgt aussehen:Imports System.ComponentModel Public Class CheckedButton ' Inherits UserControl Private WithEvents checkBoxButton As System.Windows.Forms.CheckBox Public Sub New() InitializeComponent() ' Aus InitializeComponent zur Verdeutlichung Me.checkBoxButton = New System.Windows.Forms.CheckBox() ' 'checkBoxButton ' Me.checkBoxButton.Appearance = System.Windows.Forms.Appearance.Button Me.checkBoxButton.AutoSize = True Me.checkBoxButton.Dock = System.Windows.Forms.DockStyle.Fill Me.checkBoxButton.Location = New System.Drawing.Point(0, 0) Me.checkBoxButton.Name = "checkBoxButton" Me.checkBoxButton.Size = New System.Drawing.Size(120, 24) Me.checkBoxButton.TabIndex = 0 Me.checkBoxButton.UseVisualStyleBackColor = True Me.Controls.Add(Me.checkBoxButton) End Sub #Region "Checked Eigenschaft" ''' <summary> ''' Gibt an ob die Schaltfläche markiert ist. ''' </summary> ''' <remarks>Wird an die interne Schaltfläche weitergereicht.</remarks> <Category("CheckedButton"), _ RefreshProperties(RefreshProperties.All), Bindable(True), _ DefaultValue(False)> _ Public Property Checked() As Boolean Get Return Me.checkBoxButton.Checked End Get Set(ByVal value As Boolean) Me.checkBoxButton.Checked = value End Set End Property ''' <summary> ''' Tritt ein wenn sich die CheckedChange Eigenschaft ändert. ''' </summary> ''' <remarks> ''' Leitet das Ereignis an die interne Schaltfläche weiter. ''' </remarks> <Category("CheckedButton")> _ Public Custom Event CheckedChanged As EventHandler AddHandler(ByVal value As EventHandler) AddHandler Me.checkBoxButton.CheckedChanged, value End AddHandler RemoveHandler(ByVal value As EventHandler) RemoveHandler Me.checkBoxButton.CheckedChanged, value End RemoveHandler RaiseEvent(ByVal sender As Object, ByVal e As EventArgs) ' Do Nothing Visual Basic mag es nunmal nur so ' http://www.panopticoncentral.net/archive/2004/08/06/1545.aspx End RaiseEvent End Event #End Region #Region "CheckState Eigenschaft" ''' <summary> ''' Gibt den Status der Schaltfläche an. ''' </summary> ''' <remarks>Wird an die interne Schaltfläche weitergereicht.</remarks> <Category("CheckedButton"), _ RefreshProperties(RefreshProperties.All), Bindable(True), _ DefaultValue(CheckState.Unchecked)> _ Public Property CheckState() As System.Windows.Forms.CheckState Get Return Me.checkBoxButton.CheckState End Get Set(ByVal value As System.Windows.Forms.CheckState) Me.checkBoxButton.CheckState = value End Set End Property ''' <summary> ''' Tritt ein wenn sich die CheckedChange Eigenschaft ändert. ''' </summary> ''' <remarks> ''' Leitet das Ereignis an die interne Schaltfläche weiter ''' </remarks> <Category("CheckedButton")> _ Public Custom Event CheckStateChanged As EventHandler AddHandler(ByVal value As EventHandler) AddHandler Me.checkBoxButton.CheckStateChanged, value End AddHandler RemoveHandler(ByVal value As EventHandler) RemoveHandler Me.checkBoxButton.CheckStateChanged, value End RemoveHandler RaiseEvent(ByVal sender As Object, ByVal e As EventArgs) ' Do Nothing End RaiseEvent End Event #End Region End Class
Ich habe dabei die Eigenschaftswerte direkt an das zugrundeliegende Steuerelement weitergeleitet,
ebenso die Ereignisse via Custom Event.Gruß Elmar
- Als Antwort vorgeschlagen Robert BreitenhoferModerator Dienstag, 6. April 2010 12:43
- Als Antwort markiert Bernd Schlepütz Dienstag, 6. April 2010 16:23
-
Hallo Elmar,
wie gewohnt eine ausfürliche und verständliche erklärung. vielen lieben dank dafür !
Wenn es denn nun wirklich richtig verstanden habe.
Es ist also so das ich alles komplett selber schreiben muss. Jedes Event oder auch jede Eigenschaft die so ein Control haben soll.
Das finde ich sehr entäuschen von .NET !
Warum ?
Erstelle ich ein Control, wird ja so eine Art Panel angezeigt, in der ich ja dann meine Controls gestalten kann.
Von diesem Panel werden alle Eigenschaften an das neu erstellte Control weitergegeben vererbt).
Aber genau mit diesen Eigenschaften kann ich doch bei einem selbst erstellten Control nicht anfangen. (na nicht viel)Das was der Programmierer aber weitergeben möchte, also das wo es drauf ankommt, das muss mann selber erstellen.
Ich hatte eigentlich gedacht,
und darum war mein Verständnis dafür auch so schleppend.
Wenn ich einen Button in einen Panel ziehe, kann ich dort meine Vorgaben machen und die restlichen Events und Eigenschaften werden genau wie bei dem Panel automatich weitergegeben.
Naja, dann ist es halt so.
Nochmals deutlich,
es war keine Kretik an euch.
Nun bin ich aber wieder um einiges weiter mit eurer Hilfe.lieben dank
bernd
-
Hallo Bernd,
niemand sagt, dass das Entwickeln eigener Steuerelemente keine Arbeit ist!
Mit ein, zwei Eigenschaften anpassen ist dabei selten getan,
zumindest wenn man die gleiche Qualität wie bei den mitglieferten
Steuerelementen erreichen will.Ein UserControl und auch andere Container sind nur sehr bedingt
für das Entwickeln eigener Steuerelemente geeignet. Ihre Aufgabe
liegt mehr darin eine Zusammenstellung von Steuerlementen zu
verwalten. Siehe Empfehlungen zum Typ von SteuerelementenBeim Erweitern von Steuerelementen, wie es bei Dir passiert, ist das
Ableiten von einem bestehenden Steuerelement wie CheckBox oft
einfacher. Und wo das nicht geht, entweder weil so etwas noch nicht
existiert, oder weil das bestehende Steuerlement sich nur schlecht
erweitern läßt - was bei den Windows Steuerelementen oft der Fall ist,
weil sie oft nicht die nötigen Schnittstellen haben bzw. abgeschlossen
sind. Siehe
Gewusst wie: Erstellen von Steuerelementen für Windows FormsDu kannst ja mal den anderen Ansatz versuchen, über eine Checkbox
zu gehen. Denn dort brauchst Du die Krücke für die Ereignisse nicht.
Bei der letzten Antwort hatte ich damit zwar angefangen,
es aber erst mal zurückgehalten:Imports System.ComponentModel Public Class CheckedButtonEx Inherits System.Windows.Forms.CheckBox Public Sub New() MyBase.Appearance = System.Windows.Forms.Appearance.Button MyBase.UseVisualStyleBackColor = False End Sub ''' <summary> ''' Ansicht immer als Button ''' </summary> ''' <remarks>Über Attribute ausgeblendet um Veränderungen zu verhindern</remarks> <Browsable(False), _ EditorBrowsable(EditorBrowsableState.Never), _ DefaultValue(System.Windows.Forms.Appearance.Button)> _ Public Shadows Property Appearance As System.Windows.Forms.Appearance Get Return MyBase.Appearance End Get Set(ByVal value As System.Windows.Forms.Appearance) MyBase.Appearance = value End Set End Property Private Function ShouldSerializeAppearance() As Boolean Return False End Function ''' <summary> ''' Wird selbst gmalt ''' </summary> ''' <remarks>Über Attribute ausgeblendet um Veränderungen zu verhindern</remarks> <Browsable(False), _ EditorBrowsable(EditorBrowsableState.Never), _ DefaultValue(False)> _ Public Shadows Property UseVisualStyleBackColor As Boolean Get Return MyBase.UseVisualStyleBackColor End Get Set(ByVal value As Boolean) MyBase.UseVisualStyleBackColor = value End Set End Property Private Function ShouldSerializeUseVisualStyleBackColor() As Boolean Return False End Function Protected Overrides Sub OnPaint(ByVal pe As System.Windows.Forms.PaintEventArgs) MyBase.OnPaint(pe) ' ab hier selber malen End Sub End Class
Wobei Dich dabei noch einiges erwartet, da noch vollkommen unfertig!
Hauptproblem vor jeglicher Erweitung ist dabei das Standarverhalten
so anzupassen, dass es nicht im Wege ist.
Und um es "perfekt" zu machen, lies Erweitern der Entwurfszeitunterstützung
Thorstens Links zur Benamsung solltest Du auch lesen,
denn nur wenn es wie ein Windows Forms Steuerelement in
Eigenschaften, Ereignissen usw. aussieht und verhält,
wird man es als solches honorieren.Und wenn Du damit durch bist, dürftest zumindest wissen,
warum es relativ wenige "professionelle" Steuerlemente
abseits der Standardsteuerelemente und käuflichen gibt.Als Anregung (mal wieder C#): http://www.codeproject.com/KB/buttons/RoundButton.aspx
Mir zu bunt, aber VB: http://www.codeproject.com/KB/buttons/CButton.aspxGruß Elmar
-
Hallo Elmar,
ich hatte heute bei der Arbeit 2 Stunden zeit und habe versucht deinen letzten Post mal in ein Prujekt nachzubauen.
Aber egal ws ich da heute alles angestellt habe, ich bekomme nicht mal den anfang hin.
Neues Projekt Erstellen
WindowsForms-Steuerelementbibliothek
Name -> EesteButton
UserControl1 -> Umbenennen in CheckedButtonEx
wechseln in Codeanschicht und deinen Code reinkopieren. Und schon rappelt es fehlermeldungen.
Erste fehler gleich bei:Inherits System.Windows.Forms.CheckBox
Fehler 1 Die für die CheckedButtonEx-Klasse festgelegte System.Windows.Forms.CheckBox-Basisklasse darf sich nicht von der System.Windows.Forms.UserControl-Basisklasse eines ihrer anderen partiellen Typen unterscheiden. C:\Users\Bernd\AppData\Local\Temporary Projects\ErsteButton\UserControl1.vb 4 14 ErsteButtonwas mach ich denn da falsch.
ich würde gerne dein Beispiel mal als Basis zum einsteigen nehmen.
den vorletzten Post habe ich mal in anfgrif genommen. dauert aber noch bis ich mich da durchgearbeitet habe.
gibt es eigentlich für diesen Bereich ein schönes Schritt für Schritt Tut irgenwo ?
ich habe Google und msdn durch. finde aber nichts für dummis wie mich.
lieben dank
Bernd- Bearbeitet Robert BreitenhoferModerator Donnerstag, 8. April 2010 06:17 Formatierung
-
Hallo Bernd,
erstelle einfach eine neue Klasse (oder verwende Class1 und benenne die Datei um).
Denn ein UserControl produziert schon zuviel Code (eine XXX.Designer.vb),
wo sich das Inherits UserControl versteckt.
Wenn Du die automatisch erzeugten Dateien sehen willst, aktiviere
in der Projektmappe die Ansicht "Alle Dateien anzeigen".
Gruß Elmar -
Entschuldige ich habe mich falsch ausgedrück. Wie ich eine neue Klasser erstellen weis ich ja.
Wenn ich aber eine Klasse in einer KlassenBibliothek erstelle, dann habe ich kein Test Fenster.
Erstelle ich eine ganz neues Projekt((WindowsControlLibary) darin dann einen Klasse, wird mir diese Klasse auch nicht im Test Fenster angezeigt.
"erstelle einfach eine neue Klasse (oder verwende Class1 und benenne die Datei um)."
wenn ich das mache kommt ebenfalls jeine Testfenster, es kommt sogar eine Fehlermeldung.
System.ArgumentException wurde nicht behandelt.
Message="Die Assembly \"H:\\bernddos\\VB08\\WindowsControlLibrary2\\WindowsControlLibrary2\\obj\\Debug\\WindowsControlLibrary2.dll\" enthält keine UserControl-Typen."
Source="UserControlTestContainer"
StackTrace:
bei Microsoft.VisualStudio.Tools.UserControlTestContainer.UserControlTestContainer_Load(Object sender, EventArgs e)
bei System.Windows.Forms.Form.OnLoad(EventArgs e)
bei System.Windows.Forms.Form.OnCreateControl()
bei System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
bei System.Windows.Forms.Control.CreateControl()
bei System.Windows.Forms.Control.WmShowWindow(Message& m)
bei System.Windows.Forms.Control.WndProc(Message& m)
bei System.Windows.Forms.ScrollableControl.WndProc(Message& m)
bei System.Windows.Forms.ContainerControl.WndProc(Message& m)
bei System.Windows.Forms.Form.WmShowWindow(Message& m)
bei System.Windows.Forms.Form.WndProc(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
bei System.Windows.Forms.SafeNativeMethods.ShowWindow(HandleRef hWnd, Int32 nCmdShow)
bei System.Windows.Forms.Control.SetVisibleCore(Boolean value)
bei System.Windows.Forms.Form.SetVisibleCore(Boolean value)
bei System.Windows.Forms.Control.set_Visible(Boolean value)
bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
bei System.Windows.Forms.Application.Run(Form mainForm)
bei Microsoft.VisualStudio.Tools.UserControlTestContainer.Main(String[] args)
InnerException:Ich habe jetzt jedemenge versuche. alles varianten die mir eingefallen sind.
ich erziele kein Testfenster !aber trotzdem viele lieben dank
bernd
-
Hallo Bernd,
tja, die kleinen Designer-Assistenten - bei richtigem Programmieren nerven sie leider mehr.
Hintergrund: Wenn man eine Steuerelement Bibliothek erstellt ohne weiteres Testprojekt,
so will einem VS unter die Arme greifen und verwendet den UserControlTestContainer .
Der kann aber, wie der Name schon andeutet, ausschließlich mit UserControls umgehen.Will man Steuerelemente von Grund auf entwerfen, so muß man selbst tätig werden.
Eine kleine Schritt für Schritt Anleitung - und als Download das Ergebnis.- Anlage einer Windows Forms Klassenbibliothek (CheckedButtonControlLibrary als CheckedButton Projekt)
- Löschen UserControl1.vb (brauchen wir nicht)
- Anlage der Klasse CheckButtonEx und Code von oben einfügen
- Anlage eines Windows Form Anwendung Projektes zum Testen (CheckedButtonTest)
- dieses als Startprojekt festlegen
- Projekt-Verweis hinzufügen auf CheckButtonControlLibrary
- In das Formular Form1 den Testcode einfügen:
Public Class Form1 Private CheckedButtonEx1 As CheckedButtonControlLibrary.CheckedButtonEx Public Sub New() ' This call is required by the Windows Form Designer. InitializeComponent() ' Add any initialization after the InitializeComponent() call. Me.CheckedButtonEx1 = New CheckedButtonControlLibrary.CheckedButtonEx Me.CheckedButtonEx1.Appearance = System.Windows.Forms.Appearance.Button Me.CheckedButtonEx1.Location = New System.Drawing.Point(22, 13) Me.CheckedButtonEx1.Name = "CheckedButtonEx1" Me.CheckedButtonEx1.Size = New System.Drawing.Size(104, 24) Me.CheckedButtonEx1.TabIndex = 0 Me.CheckedButtonEx1.Text = "CheckedButtonEx1" Me.Controls.Add(Me.CheckedButtonEx1) End Sub End Class
Alternativ kannst Du die CheckedButtonControlLibrary zur ToolBox hinzufügen , was sich
aber in der Regel erst ab einem einigermaßen ausgereiften Entwicklungsstand lohnt.
Vorher wird der generierte Code häufiger bei Änderungen Fehler verursachen und
da ist es besser das Erzeugen selbst in die Hand zu nehmen (was man auch können sollte).Gruß Elmar
-
Hallo Elmar,
vielen lieben dank.
Das ist mal eine knackige, kurze und konkrete Anleitung.
Damit komme ich weiter. Nun habe ich eine Grundlage mit der ich arbeiten und lernen kann.
Das es kein Zuckerschlecken wird ist mir klar. Das ich auch noch viel dazu lernen musss, ebenfalls.
Aber ich habe mittlerweile 11 Bücher gekauft. Was mir bei den Büchern auffällt, jeder versucht soviele Themen wie möglich reinzupacken.
Die sollten lieber mal ein Buch mit einem vernünftigem konzept gestalten und ein Thema von A-Z beahndeln.
vielen danknun werde ich der EigeneCotrol Champ. hihi