2012-02-01 80 views
2

我有一个Visual Studio,Visual Basic窗体包含一个确定按钮和一个取消按钮。Windows窗体取消按钮不工作

我想要做的是有确定按钮保存用户选择的选项,当然取消按钮放弃它们,并返回到他们以前的值。

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

有没有更好的方法来做我希望这个表单做的事情?

编辑:

这里是到目前为止的两个按钮的代码,两者都被设置为关闭该窗口。 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 
+0

如果没有您的代码,我们不能帮您 – Akrem 2012-02-01 14:28:46

+0

您是否试过单步执行代码以查看发生了什么? – 2012-02-01 15:08:55

回答

2

不要更改“值”,直到用户点击保存按钮。

表单应该预装一份您想要更新的值的副本。

取消按钮应该关闭表单。

保存按钮应导致更新“值”,而不是窗体副本。

编辑: -

关于这个问题,有什么不对,你已经发布的代码。正确的处理程序被称为正确的按钮点击?表单的AcceptButtonCancelButton属性是否设置为正确的按钮?

您的编辑控件绑定了哪些数据?

+0

好的,我想我可以跟着你。所以,几乎所有的选项都要存储在一组变量中,并且每次都要预先加载这些变量。当我想保存表单时,只需将表单值复制到预加载的变量中。 当我想丢弃表单时,简单地不做任何事情。我只需要让程序调用预制变量。 – 2012-02-01 15:07:12

+0

@保罗威廉姆斯,确切地说,就是这样。所以表单可以传递值或在加载时读取它们。 – Jodrell 2012-02-01 15:16:21

+0

原则上听起来很容易,但是如何避免在选项部分中设置跨20或25个子集的任何值?是不是My.Settings.Save()是为了?要基本上保存设置的用户设置,只有当你使用它并销毁它们,如果你不这样做?如果没有,它有什么意义? – thebunnyrules 2017-06-08 07:47:04

1

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

编辑:

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

+0

好吧,现在我正在理解你的问题。在程序运行时,这些选项应该存储到内存中。我没有将它们保存到配置文件中。 – 2012-02-01 15:05:11

1

你的事件处理程序的取消按钮应该是这样的:

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

的OK按钮的事件处理程序应该是这样的:

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 

它就是这么简单!

+1

除了更简单和更正确的处理程序命名之外,我不明白这与问题有何不同。 – Jodrell 2012-02-01 15:17:53

+0

是的,与问题中的代码相同,很好奇这个答案被接受了。 – 2012-02-01 15:29:49

+0

对不起。这个网站还是新手。 – 2012-02-01 15:37:28

1

如果你打开你的格式如

myForm.showdialog() 

你没有定义关闭按钮单击事件处理程序,它会自动处理;只要设置'DialogResult'属性按钮

btnCancel.DialogResult = DialogResult.Cancel 

此外,如果你想关闭时ESC按下然后设置'CancelButton'属性窗体的形式:

myForm.CancelButton = btnCancel 

在另一方面,如果你打开表格就好像

myForm.Show() 

你确实需要指定动作(s)在close bu tton click event here,即:

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

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

我最终采取了Jordell的建议:不要更改“值”,直到用户单击保存按钮但我不太清楚如何去解决它。

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

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 

而且只有withing的好子我打电话给My.Settings。

'Theme Section 
My.Settings.colorBtnBack = tempOptionsThemeLB_Back