【问题标题】:Windows Form Cancel Button Not WorkingWindows 窗体取消按钮不起作用
【发布时间】:2012-02-01 14:25:23
【问题描述】:

我有一个 Visual Studio、Visual Basic 表单,其中包括一个确定按钮和一个取消按钮。

我想要做的是让 OK 按钮保存用户选择的选项,当然还有 Cancel 按钮丢弃它们并将它们返回到以前的值。

但我注意到,当我调试表单时,无论我选择哪个按钮,值都会被保存。在表单的属性中,我已经声明 CancelBtn 确实是 CancelBtn,并且 OK 按钮是 OK 按钮,但是无论如何,值仍然被保存。

有没有更好的方法来完成我希望此表单执行的操作?

编辑:

到目前为止,这是两个按钮的代码,都被设置为关闭窗口。 AcceptOption 应该保存这些值,而 CancelOption 应该只是关闭表单。如果做得不好,我很抱歉,但我发现的常见问题解答只提到更改每个按钮的属性,而没有提及代码。:

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles AcceptOptionBtn.Click
    ' Save the Options
    Me.Close()
    ' Close the form
End Sub

Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles CancelOptionBtn.Click
    ' Close the form
    Me.Close()
End Sub

【问题讨论】:

  • 如果没有您的一些代码,我们将无法帮助您
  • 您是否尝试过单步执行代码以查看发生了什么?

标签: vb.net visual-studio-2010 cancel-button acceptbutton


【解决方案1】:

在用户单击“保存”按钮之前不要更改“值”。

表单应预先加载您要更新的值的副本。

取消按钮应该只是关闭表单。

保存按钮应该导致“值”而不是表单副本被更新。

编辑:-

关于这个问题,您发布的代码没有任何问题。是否为右键单击调用了正确的处理程序?表单的AcceptButtonCancelButton 属性是否设置为右侧按钮?

您的编辑控件绑定到哪些数据(如果有的话)?

【讨论】:

  • 好的,我想我可以关注你这个。差不多,将我想要更改的选项存储在一组变量中,并让表单每次都预加载这些变量。当我想保存表单时,只需将表单值复制到预加载的变量中。当我想丢弃表格时,什么也不做。我只需要让程序调用预制变量。
  • @Paul Williams,就是这样。因此,表单既可以传递值,也可以在加载时读取它们。
  • 原则上听起来很简单,但是如何避免在选项部分中设置跨 20 或 25 个子项的任何值?这不是 My.Settings.Save() 的用途吗?基本上只有在使用时才保存设置的用户设置,如果不使用则销毁它们?如果不是,拥有它有什么意义?
  • @thebunnyrules,1. 不要编写那样的代码。 2. My.Settings 对象提供对应用程序设置的访问。不知道这有什么关系。 docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/…
【解决方案2】:

确定和取消按钮没有什么神奇之处。它们只是……按钮。如果您在每次进行更改时保存数据,“取消”按钮不会神奇地“取消保存”它们。尽管如果您在 OK 按钮的 Click 事件处理程序中保存更改,那么单击 Cancel 按钮显然不会保存您的更改。为了进一步帮助您,我们需要了解您如何保存数据。

编辑:

通过查看您的代码,我认为您正在将数据直接传递到您的表单,而无需执行对象的副本。因此,如果您修改此数据,它也会在父窗体中更改。通过使用此表单中的数据副本,任何未保存的更改都将被正确丢弃。

【讨论】:

  • 好的,现在我明白你的问题了。程序运行时,选项应存储到内存中。我没有将它们保存到配置文件中。
【解决方案3】:

取消按钮的事件处理程序应如下所示:

Private Sub btnCancel_Click(sender As System.Object, e As System.EventArgs) Handles btnCancel.Click
    Me.Close()
End Sub

确定按钮的事件处理程序应如下所示:

Private Sub btnOK_Click(sender As System.Object, e As System.EventArgs) Handles btnOK.Click
    SaveSettings 'call a routine to save the settings the user has entered
    Me.Close()
End Sub

就这么简单!

【讨论】:

  • 我看不出这与问题有何不同,除了处理程序的更简单和更正确的命名。
  • 是的,与问题中的代码相同,奇怪的是这个答案被接受了。
  • 对不起那个。网站还是新手。
  • @Jodrell - 在我发布此问题一分钟后编辑了该问题以包含代码提取。
【解决方案4】:

如果你打开你的表单像

myForm.showdialog()

您不必为关闭按钮单击事件定义处理程序,它会自动处理;只需为按钮设置'DialogResult' 属性

btnCancel.DialogResult = DialogResult.Cancel

此外,如果您想在按下 ESC 时关闭表单,请为该表单设置 'CancelButton' 属性:

myForm.CancelButton = btnCancel

另一方面,如果您像这样打开表单

myForm.Show()

您确实需要指定对关闭按钮单击事件采取的操作,如此处所示,即:

Private Sub BtnCancelClick(ByVal sender As System.Object, ByVal e As EventArgs) Handles btnCancel.Click
     Close()
End Sub

【讨论】:

    【解决方案5】:

    我遇到了同样的问题。一旦我使用 My.Settings.Blabla = Blabla.value,即使我没有使用 My.Settings.Save(),它也会被保存,这使得 My.Settings.Save() 就我所知完全没有意义。

    我最终接受了 Jordell 的建议:在用户单击“保存”按钮之前不要更改“值”,但我不太清楚如何去做。

    我最终在我的所有设置子中使用了临时变量,而不是用户 My.Settings.UserConfigs。只有当我在 OK 潜艇时我才打电话

    My.Settings.UserConfigSetting = temporary_UserCofigValue

    这是我正在处理的代码中的一个示例:

    Private Sub btnOptionsThemeLB_Back_Update_Click(sender As System.Object, e As System.EventArgs) Handles btnOptionsThemeLB_Back_Update.Click
        If (tempOptionsThemeLB_Back = Nothing) Then
            tempOptionsThemeLB_Back = Me.btnOptionsThemeLB_Back.BackColor
        End If
        tempOptionsThemeLB_Back = RGBToColor(txtbOptionsThemeLB_Back_Red.Text, txtbOptionsThemeLB_Back_Green.Text, txtbOptionsThemeLB_Back_Blue.Text, tempOptionsThemeLB_Back)
        Me.btnOptionsThemeLB_Back.BackColor = tempOptionsThemeLB_Back
    End Sub
    

    只有使用 Ok 子程序,我才调用 My.Settings。

    'Theme Section
    My.Settings.colorBtnBack = tempOptionsThemeLB_Back
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-17
      • 2013-06-05
      • 1970-01-01
      • 1970-01-01
      • 2014-02-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多