【问题标题】:Changing Controls of a form inside a panel更改面板内表单的控件
【发布时间】:2014-12-06 04:57:38
【问题描述】:

我遇到了一个奇怪的问题

我有 3 个表单:MainFormForm1Form2
MainForm 有 1 个面板:Panel1
Form1 有 1 个标签:NameLbl 和按钮:ChangeBtn
Form2 有 1 个文本框:NameTxt 和按钮:SaveBtn

我用下面的代码在Panel1里面打开form1mainform

 Panel1.Controls.Clear()
 Dim FormInPanel As New Form1()
 FormInPanel.TopLevel = False
 Panel1.Controls.Add(FormInPanel)
 FormInPanel.Show()

打开ChangeBtn.Click Form2 打开为showdialog
我希望NameLbl.text 在单击SaveBtn 时更改为NameLbl.text 但正常代码不起作用。

Private Sub SaveBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SaveBtn.Click
    Form1.NameLbl.text=NameTxt.text
End Sub

我该怎么办?有什么建议?鉴于出于某些原因我需要在面板中打开表单。
请记住,这只是一个示例。我在 Form1 中有多个控件,我想在 form2.SaveBtn.click 上进行更改

我也试过这个,但它什么也没做

Private Sub SaveBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SaveBtn.Click

    For Each c As Control In MainForm.Panel1.Controls(0).Controls
        If c.Name="NameLbl" Then
            c.Text = NameTxt.Text
        End If
    Next
End Sub

请有人告诉我它是怎么做到的!

【问题讨论】:

  • 您的标签/表单定义的公开程度如何?您是否遇到构建错误?

标签: vb.net winforms forms visual-studio-2010 panels


【解决方案1】:

Form2 似乎与 Form1 或 MainForm 没有任何联系。您需要从 MainForm 处理或另一个类处理并可以传递给 MainForm 的 Form2 引发一个事件

编辑:

抱歉,我刚刚看到您如何调用 Form2。在调用 ShowDialog() 后,有很多方法可以从 Form2 中取回一个值。一种是创建一个名为 Result 的属性,并在 ShowDialog() == DialogResult.OK 时检查 Result。类似于以下内容。

Public Class Form2
    Inherits System.Windows.Forms.Form
    Public Property Result() As String
        Get
            Return m_Result
        End Get
        Set
            m_Result = Value
        End Set
    End Property
    Private m_Result As String
End Class

Public Class Form1
    Inherits System.Windows.Forms.Form
    Public ChangeBtn As Button
    Public NameLbl As Label
    Public Sub New()
        Me.ChangeBtn = New Button()
        AddHandler Me.ChangeBtn.Click, AddressOf ChangeBtn_Click
        Me.NameLbl = New Label()
    End Sub

    Private Sub ChangeBtn_Click(sender As Object, e As EventArgs)
        Dim form As New Form2()
        Dim dr = New form.ShowDialog()
        If dr = DialogResult.OK Then
            Me.NameLbl.Text = form.Result
        End If
    End Sub
End Class

我想补充一点,如果您计划将该应用程序扩展得更大,您会遇到维护问题。如果您有兴趣,请查看一些处理 UI 逻辑的模式,例如 MVC、MVP、MVVM。

【讨论】:

  • 谢谢,通过 developerfusion 转换器运行它
  • 我需要它成为一个 Windows 窗体应用程序。我想让它成为单窗口界面。所以我认为在面板中打开表单将是最好的选择。
【解决方案2】:

你可以试试这个代码:

Private Sub SaveBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SaveBtn.Click
   panel1.Controls(0).NameLbl.text=NameTxt.text '"0" is the index of forminpanel in panel1,maybe it need to change.
End Sub

【讨论】:

    【解决方案3】:

    Form1包含在Panel1中,所以无法通过

    访问
      Form1.
    

    Form2 中只有 MainForm 可见:

    Private Sub SaveBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SaveBtn.Click
        For Each c As Control In MainForm.Panel1.Controls(0).Controls
            If TypeOf c Is TextBox Then
                c.Text = NameTxt.Text
            End If
        Next
    End Sub
    

    【讨论】:

    • 我在 Form1 中有多个控件,我想从 Form2 进行更改。在我的问题中,我只是举了一个例子。使用您的代码,我无法解决特定的控件。
    • @SubhajitMukherjee 您有一个问题并给了您答案。然后你说这只是一个例子,需要别的东西。我不会玩这个游戏。
    【解决方案4】:

    试试这个:

    For Each form1 As Form1 In MainForm.OwnedForms.OfType(Of Form1)
        Form1.NameLbl.text = NameTxt.text
    Next
    

    【讨论】:

      【解决方案5】:

      我遇到了同样的问题,我已经解决了这个问题

           Dim f As FormInPanel
           f = Form.Panel1.Controls(0)
           f.transection = True
           f.NameLbl.text=NameTxt.text
      

      【讨论】:

        猜你喜欢
        • 2012-01-11
        • 1970-01-01
        • 2010-12-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多