Кнопка отмены формы Windows не работает

У меня есть форма Visual Studio, Visual Basic, которая включает кнопку «ОК» и кнопку «Отмена».

Я хочу, чтобы кнопка «ОК» сохраняла параметры, которые выбирает пользователь, и, конечно же, кнопка «Отмена» отбрасывала их и возвращала им прежние значения.

Но я заметил, что при отладке формы значения сохраняются независимо от того, какую кнопку я выбираю. В свойствах формы я объявил, что 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

person Paul Williams    schedule 01.02.2012    source источник
comment
Мы не сможем вам помочь без вашего кода   -  person Akrem    schedule 01.02.2012
comment
Пробовали ли вы пройтись по коду, чтобы увидеть, что происходит?   -  person Matt Wilko    schedule 01.02.2012


Ответы (5)


Не изменяйте «значения», пока пользователь не нажмет кнопку «Сохранить».

Форма должна быть предварительно загружена с копией значений, которые вы хотите обновить.

Кнопка «Отмена» должна просто закрыть форму.

Кнопка «Сохранить» должна вызывать обновление «значений», а не копии формы.

РЕДАКТИРОВАТЬ:-

Что касается этого вопроса, в опубликованном вами коде нет ничего плохого. Вызываются ли правильные обработчики для кликов правой кнопки? Установлены ли свойства формы AcceptButton и CancelButton для нужных кнопок?

К каким данным привязаны ваши элементы управления редактированием, если вообще привязаны?

person Jodrell    schedule 01.02.2012
comment
Ладно, я думаю, я могу следовать за вами в этом. Таким образом, сохраняйте параметры, которые я хочу изменить, в одном наборе переменных, и форма каждый раз предварительно загружает эти переменные. Когда я хочу сохранить форму, просто скопируйте значения формы в предварительно загруженные переменные. Когда я хочу отказаться от формы, ничего не делать. Мне просто нужно, чтобы программа вызывала готовые переменные. - person Paul Williams; 01.02.2012
comment
@ Пол Уильямс, точно, вот и все. Таким образом, форме можно либо передать значения, либо прочитать их при загрузке. - person Jodrell; 01.02.2012
comment
Звучит просто в принципе, но как избежать установки каких-либо значений для 20 или 25 сабвуферов в разделе параметров? Разве это не My.Settings.Save()? Чтобы в основном сохранить ваши пользовательские настройки, только если вы их используете, и уничтожить их, если вы этого не сделаете? Если нет, то какой смысл его иметь? - person thebunnyrules; 08.06.2017
comment
@thebunnyrules, 1. Не пишите код, который делает это. 2. Объект My.Settings предоставляет доступ к настройкам приложения. Не уверен, насколько это уместно. docs.microsoft.com/ en-us/dotnet/visual-basic/language-reference/ - person Jodrell; 08.06.2017

В кнопках «ОК» и «Отмена» нет ничего волшебного. Это просто... пуговицы. Если вы сохраняете свои данные каждый раз, когда вносите изменения, кнопка «Отмена» не волшебным образом «отменит» их. Хотя, если вы сохраните изменения в обработчике события Click кнопки «ОК», то нажатие кнопки «Отмена», очевидно, не сохранит ваши изменения. Чтобы помочь вам в дальнейшем, нам нужно знать, как вы сохраняете свои данные.

Редактировать:

Глядя на ваш код, я думаю, что вы передаете данные непосредственно в свою форму, не выполняя копию своих объектов. Поэтому, если вы измените эти данные, они также будут изменены в родительской форме. При работе с копией ваших данных в этой форме любые несохраненные изменения будут корректно отменены.

person Meta-Knight    schedule 01.02.2012
comment
Хорошо, теперь я понимаю ваш вопрос. Опции должны быть сохранены в памяти во время работы программы. Я не сохраняю их в файл конфигурации. - person Paul Williams; 01.02.2012

Ваш обработчик события для кнопки отмены должен выглядеть так:

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

Это так просто!

person Matt Wilko    schedule 01.02.2012
comment
Я не вижу, чем это отличается от вопроса, кроме более простого и правильного именования обработчиков. - person Jodrell; 01.02.2012
comment
Да, тот же код, что и в вопросе, любопытно, что этот ответ был принят. - person Meta-Knight; 01.02.2012
comment
Извините за это. Еще новичок на сайте. - person Paul Williams; 01.02.2012
comment
@Jodrell - вопрос был отредактирован через минуту после того, как я опубликовал его, чтобы включить выдержку из кода. - person Matt Wilko; 01.02.2012

Если вы откроете форму, как

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
person armadillo.mx    schedule 21.06.2012

У меня были те же проблемы. Как только я использую My.Settings.Blabla = Blabla.value, оно сохраняется, даже если я не использовал My.Settings.Save(), что, насколько я могу судить, делает My.Settings.Save() совершенно бессмысленным.

В конце концов я последовал совету Джорделла: Не изменяйте "значения", пока пользователь не нажмет кнопку "Сохранить", но мне было не очень понятно, как это сделать.

В итоге я использовал временные переменные во всех своих настройках вместо пользователя My.Settings.UserConfigs. Только когда я был в ОК, я позвонил

My.Settings.UserConfigSetting = временное_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
person thebunnyrules    schedule 08.06.2017