繁体   English   中英

简单的对话框,例如带有自定义按钮(vb)的msgbox

[英]simple dialog like msgbox with custom buttons (vb)

我想问用户例如“您想向右还是向左走?”。
为了获得简单的代码,我使用MSGBOX并给出如下提示:

“您想向右走还是向左走”

按“是”右“ /否”左“”

然后,我处理被按下的是/否/取消。 这是可行的,但是很难看,在某些情况下很难理解。

另外在某些情况下,我还有两个以上的选择-但这可能是另一个问题...

  1. 您需要根据自己的需要创建自己的“自定义” msgbox表单,更好地创建可重用的控件-通过自定义控件的构造函数传递“问题”字符串。
  2. 您需要一些“方法”来从自定义msgbox之外获取用户决策-一种方法是使用DialogResult枚举。

这是我刚刚写来演示的一个基本示例,请参阅我在代码内添加的注释。


创建一个具有2个表单的新项目,Form1将是将调用自定义msgbox的主表单,而Form2将是自定义msgbox的主表单:

Form1中:

在此处输入图片说明

窗体2:

在此处输入图片说明

Form1的代码:

Public Class Form1
    Private Sub btnOpenCustomMsgbox_Click(sender As Object, e As EventArgs) Handles btnOpenCustomMsgbox.Click
        Dim customMsgbox = New Form2("this is my custom msg, if you press yes i will do something if you press no i will do nothing")
        If customMsgbox.ShowDialog() = DialogResult.Yes Then
            ' do something
            MsgBox("I am doing some operation...")
        Else
            ' do nothing (its DialogResult.no)
            MsgBox("I am doing nothing...")
        End If
    End Sub
End Class

Form2的代码:

Public Class Form2

    ' field that will contain the messege
    Private PromtMsg As String
    Sub New(ByVal promtmsg As String)

        ' This call is required by the designer.
        InitializeComponent()

        ' Add any initialization after the InitializeComponent() call.
        ' set global field with the argument that was passed to the constructor
        Me.PromtMsg = promtmsg
    End Sub

    Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ' set the msg label
        Me.lblPromtMsg.Text = Me.PromtMsg
    End Sub

    Private Sub btnCustomYes_Click(sender As Object, e As EventArgs) Handles btnCustomYes.Click
        ' user choosed yes - return DialogResult.Yes
        Me.DialogResult = DialogResult.Yes
        Me.Close()
    End Sub

    Private Sub btnCustomNo_Click(sender As Object, e As EventArgs) Handles btnCustomNo.Click
        ' user choosed no - DialogResult.no
        Me.DialogResult = DialogResult.No
        Me.Close()
    End Sub

End Class

它可能要复杂得多,但是如果您探索该示例,我希望您能理解总体思路。

您可以动态创建一个

Public Module CustomMessageBox
    Private result As String
    Public Function Show(options As IEnumerable(Of String), Optional message As String = "", Optional title As String = "") As String
        result = "Cancel"
        Dim myForm As New Form With {.Text = title}
        Dim tlp As New TableLayoutPanel With {.ColumnCount = 1, .RowCount = 2}
        Dim flp As New FlowLayoutPanel()
        Dim l As New Label With {.Text = message}
        myForm.Controls.Add(tlp)
        tlp.Dock = DockStyle.Fill
        tlp.Controls.Add(l)
        l.Dock = DockStyle.Fill
        tlp.Controls.Add(flp)
        flp.Dock = DockStyle.Fill
        For Each o In options
            Dim b As New Button With {.Text = o}
            flp.Controls.Add(b)
            AddHandler b.Click,
                Sub(sender As Object, e As EventArgs)
                    result = DirectCast(sender, Button).Text
                    myForm.Close()
                End Sub
        Next
        myForm.FormBorderStyle = FormBorderStyle.FixedDialog
        myForm.Height = 100
        myForm.ShowDialog()
        Return result
    End Function
End Module

您会看到有关存在哪些按钮,消息和标题的选项。

这样使用

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim result = CustomMessageBox.Show(
            {"Right", "Left"},
            "Do you want to go right or left?",
            "Confirm Direction")
        MessageBox.Show(result)
    End Sub
End Class

在我的示例中,提示是"Do you want to go right or left?" 并且选项为"Right""Left"

返回字符串,而不是DialogResult,因为现在您的选项是无限的(!)。 尝试适合自己的尺码。

在此处输入图片说明

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM