Windows窗体取消按钮不起作用

时间:2012-02-01 14:25:24

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

我有一个Visual Studio,Visual Basic表单,其中包含一个OK按钮和一个Cancel按钮。

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

但是我注意到的是,当我正在调试表单时,无论我选择哪个按钮,都会保存这些值。在表单的属性上,我已经声明确实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

5 个答案:

答案 0 :(得分:2)

在用户点击“保存”按钮之前,请勿更改“值”。

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

取消按钮应该关闭表单。

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

编辑: -

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

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

答案 1 :(得分:1)

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

编辑:

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

答案 2 :(得分:1)

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

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

就这么简单!

答案 3 :(得分:1)

如果您打开表单

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

答案 4 :(得分:1)

我遇到了同样的问题。一旦我使用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 sub才能调用My.Settings。

'Theme Section
My.Settings.colorBtnBack = tempOptionsThemeLB_Back