23. marts 2005 - 23:58Der er
10 kommentarer og 1 løsning
Finde form - hvordan?
Hi, har et projekt med 2 forme - FormA of FormB, hvor FormA er startformen. På FormA har jeg en knap, som åbner FormB via følgende kode:
Dim FormB As New FormB FormB.Show()
Og det virker også fint, men klikkes flere gange på knappen åbnes flere forme - det er der ikke helt brug for, den skal bare vise en af dem som er lavet (fra FormB kan laves flere FormB'ere)
Hvis det er ShowDialog() du tænker på, kan jeg jo ikke benytte FormA imens FormB bliver vist, og i form af, at FormA er min "menu"-form er det et must...
Hvad med at lave en HelperClass med en Shared HashTable hvori, du hver gang åbner en form, gemmer en Type af den form i den. Til at fjerne typen igen når formen lukkes kan du bruge Form.Closed-eventen, og før du åbner en form tjekker du om den pågældende type findes i hashtable'n eller ej.
:) here it goes (så fik jeg vist også genopfrisket min rustne vb.net-syntaks ;))
Public Class Form1 Inherits System.Windows.Forms.Form
#Region " Windows Form Designer generated code "
Public Sub New() MyBase.New()
'This call is required by the Windows Form Designer. InitializeComponent()
'Add any initialization after the InitializeComponent() call
End Sub
'Form overrides dispose to clean up the component list. Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean) If disposing Then If Not (components Is Nothing) Then components.Dispose() End If End If MyBase.Dispose(disposing) End Sub
'Required by the Windows Form Designer Private components As System.ComponentModel.IContainer
'NOTE: The following procedure is required by the Windows Form Designer 'It can be modified using the Windows Form Designer. 'Do not modify it using the code editor. Friend WithEvents Label1 As System.Windows.Forms.Label Friend WithEvents Button1 As System.Windows.Forms.Button <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent() Me.Label1 = New System.Windows.Forms.Label Me.Button1 = New System.Windows.Forms.Button Me.SuspendLayout() ' 'Label1 ' Me.Label1.Font = New System.Drawing.Font("Microsoft Sans Serif", 14.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) Me.Label1.Location = New System.Drawing.Point(56, 32) Me.Label1.Name = "Label1" Me.Label1.Size = New System.Drawing.Size(176, 48) Me.Label1.TabIndex = 0 Me.Label1.Text = "Hej, jeg er form 1" ' 'Button1 ' Me.Button1.Location = New System.Drawing.Point(184, 104) Me.Button1.Name = "Button1" Me.Button1.TabIndex = 1 Me.Button1.Text = "Åbn Form2" ' 'Form1 ' Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13) Me.ClientSize = New System.Drawing.Size(296, 149) Me.Controls.Add(Me.Button1) Me.Controls.Add(Me.Label1) Me.Name = "Form1" Me.Text = "Form1" Me.ResumeLayout(False)
End Sub
#End Region
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim _f As Form2 = New Form2
If FormManager.Exists(_f) Then MessageBox.Show("Form2 already open")
Public Class Form2 Inherits System.Windows.Forms.Form
#Region " Windows Form Designer generated code "
Public Sub New() MyBase.New()
'This call is required by the Windows Form Designer. InitializeComponent()
'Add any initialization after the InitializeComponent() call
End Sub
'Form overrides dispose to clean up the component list. Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean) If disposing Then If Not (components Is Nothing) Then components.Dispose() End If End If MyBase.Dispose(disposing) End Sub
'Required by the Windows Form Designer Private components As System.ComponentModel.IContainer
'NOTE: The following procedure is required by the Windows Form Designer 'It can be modified using the Windows Form Designer. 'Do not modify it using the code editor. Friend WithEvents Label1 As System.Windows.Forms.Label <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent() Me.Label1 = New System.Windows.Forms.Label Me.SuspendLayout() ' 'Label1 ' Me.Label1.Font = New System.Drawing.Font("Microsoft Sans Serif", 18.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) Me.Label1.Location = New System.Drawing.Point(56, 56) Me.Label1.Name = "Label1" Me.Label1.Size = New System.Drawing.Size(208, 48) Me.Label1.TabIndex = 0 Me.Label1.Text = "Hej, jeg er form 2" ' 'Form2 ' Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13) Me.ClientSize = New System.Drawing.Size(292, 273) Me.Controls.Add(Me.Label1) Me.Name = "Form2" Me.Text = "Form2" Me.ResumeLayout(False)
End Sub
#End Region
Private Sub Form2_Closed(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Closed FormManager.Remove(Me) End Sub End Class
Public Class FormManager
Private Shared _table As Hashtable = New Hashtable
Public Shared Sub Add(ByRef _form As Form) If FormManager.Exists(_form) Then Throw New Exception("Form already open") End If
FormManager._table.Add(_form.GetType(), _form) End Sub
Public Shared Sub Remove(ByRef _form As Form) FormManager._table.Remove(_form.GetType()) End Sub
Public Shared Function Exists(ByRef _form As Form) As Boolean Return FormManager._table.Contains(_form.GetType()) End Function
Public Shared Function GetFormInstance(ByRef _form As Form) As Form If Not FormManager.Exists(_form) Then Return Nothing End If
Return FormManager._table.Item(_form.GetType()) End Function
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.