【问题标题】:VB 2013 How to Convert Working Code to DynamicVB 2013 如何将工作代码转换为动态代码
【发布时间】:2014-06-16 03:17:36
【问题描述】:

您好,我有一个正在制作的项目的工作代码...

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim FolderDlg = FolderBrowserDialog1
    'Checks if there is a value to the Selected folder

    If FolderDlg.SelectedPath = "" Then


        'If no value asks to set one
        MsgBox("Please Set a Directory")

        FolderDlg.ShowDialog()
        If DialogResult.OK Then
            Button1.Text = Path.GetFileName(FolderDlg.SelectedPath)
        End If
        Exit Sub
    End If

    Process.Start("explorer.exe", FolderDlg.SelectedPath)

End Sub

我希望能够拥有创建此代码副本的“AddNew”按钮。我知道如何创建动态按钮,但它们都调用相同的 FolderBrowserDialog..

编辑这是我的添加新按钮,它创建带有标签的按钮,还创建带有标签的 FolderBrowserDialogs。

   Private Sub AddNew_Click(sender As Object, e As EventArgs) Handles AddNew.Click

    Dim count As Integer = FloLay.Controls.OfType(Of Button)().ToList().Count
    Dim button As New Button()
    count = FloLay.Controls.OfType(Of Button)().ToList().Count
    'button.Location = New System.Drawing.Point(150, 25 * count)
    'button.Size = New System.Drawing.Size(60, 20)
    button.Name = "button_" & (count + 1)
    button.Text = "Button_ " & (count + 1)
    button.Tag = "Button_" & (count + 1)
    AddHandler button.Click, AddressOf Set_Dir


    Dim FolderDlg As New FolderBrowserDialog

    count = FloLay.Controls.OfType(Of FolderBrowserDialog)().ToList().Count

    FolderDlg.Tag = "FolderDlg_" & (count + 1)

    FloLay.Controls.Add(button)


End Sub

EDIT 3这是我的NEW NEW事件处理程序

     Private Sub Set_Dir(sender As Object, e As EventArgs)
    Dim btn = DirectCast(sender, Button)

    If btn.Tag Is Nothing Then
        Using fbd As New FolderBrowserDialog
            fbd.ShowDialog()
            btn.Tag = fbd.SelectedPath

        End Using

    End If

    Dim path = CStr(btn.Tag)
    '   MsgBox(path)

    Process.Start("explorer.exe", path)
End Sub

现在只在应用重启或重启后添加 Button.Name = GetFileNAme 和持久性

编辑 4

 Private Sub Set_Dir(sender As Object, e As EventArgs)
    Dim btn = DirectCast(sender, Button)

    If btn.Tag Is Nothing Then
        Using fbd As New FolderBrowserDialog
            fbd.ShowDialog()
            btn.Tag = fbd.SelectedPath
            btn.Text = path.GetFileName(fbd.SelectedPath)
        End Using
        Exit Sub
    End If
    Dim Folderpath = CStr(btn.Tag)
    ' MsgBox(Folderpath)
    Process.Start("explorer.exe", Folderpath)

End Sub

现在它就像一个魅力!

【问题讨论】:

  • 听起来你比动态控件更需要 IF 语句
  • 你有我可以效仿的例子吗?

标签: vb.net visual-studio-2010 visual-studio-2012 dynamic visual-studio-2013


【解决方案1】:

您不能创建代码的副本。您需要做的是让事件处理程序中的代码根据单击的Button 确定要做什么。创建Button 时,可以在其Tag 属性中存储一些数据。在事件处理程序中,sender 参数是对引发事件的对象的引用,即被单击的 Button。然后,您可以从其Tag 属性中取回该数据并使用它。您将使用该数据以适合Button 的任何方式配置FolderBrowserDialog。例如

创建Button

Dim btn As New Button

AddHandler btn.Click, AddressOf ButtonClicked
Me.Controls.Add(btn)

在事件处理程序内部:

Dim btn = DirectCast(sender, Button)

If btn.Tag Is Nothing Then
    Using fbd As New FolderBrowserDialog
        fbd.ShowDialog()
        btn.Tag = fbd.SelectedPath
    End Using
End If

Dim path = CStr(btn.Tag)

'Use path here.

注意Tag 属性是Object 类型,所以它可以是任何你想要的。它可以像Integer 一样简单,也可以像DataSet 一样复杂。您只需在事件处理程序中将其转换为适当的类型,然后正常访问所有数据。

【讨论】:

  • 无论如何你可以给我看一个你在说什么的例子吗?或者分享一个链接?
  • 在创建Button 时不会创建FolderBrowserDialog。您在事件处理程序中创建FolderBrowserDialog,并使用从ButtonTag 获得的数据对其进行配置。我一开始就是这么说的。
  • 现在它不断让新文件夹浏览器看到我的 EDIT 2
  • 这么简单,你却把事情搞砸了。当用户单击Button 时创建FolderBrowserDialog,使用它然后丢弃它。就是这么简单。请参阅答案中的更新代码。或者,在设计器中向您的表单添加一个,并在每次单击 Button 时简单地配置它。只是不要试图保持对话的集合。
  • 不...如果我单击相同的按钮,仍然在选择路径之后 ShowDialog 事件再次发生
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-29
  • 2013-08-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-26
  • 2018-07-09
相关资源
最近更新 更多