2012-02-01 6 views
2

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

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

Но я замечаю, что, поскольку я отлаживаю форму, значения сохраняются независимо от той кнопки, которую я выбираю. В свойствах формы я заявил, что действительно CancelBtn является CancelBtn и что кнопка OK является кнопкой OK, но значения все равно сохраняются независимо.

Есть ли лучший способ сделать то, что мне нужна эта форма?

EDIT:

Вот код до сих пор для этих двух кнопок, как создаются, чтобы закрыть окно. 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

+0

Вы пробовали пошаговый свой код, чтобы увидеть, что происходит? –

ответ

2

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

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

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

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

EDIT: -

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

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

+0

Хорошо, я думаю, что смогу следовать за вами на этом. В значительной степени сохраните параметры, которые я хочу изменить в одном наборе переменных, и каждый раз приготовьте эти переменные. Когда я хочу сохранить форму, просто скопируйте значения форм в предварительно загруженные переменные. Когда я хочу отказаться от формы, просто ничего не делайте. Мне просто нужно, чтобы программа вызывала готовые переменные. –

+0

@Paul Williams, точно, вот и все. Таким образом, форма может передаваться или считываться при загрузке. – Jodrell

+0

Звучит просто, но как вы можете не устанавливать значения в 20 или 25 подсетей в разделе параметров? Разве это не для My.Settings.Save()? Чтобы сохранить настройки пользовательских настроек только в том случае, если вы используете их и уничтожаете, если вы этого не сделаете? Если нет, то в чем смысл этого? – thebunnyrules

1

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

Edit:

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

+0

Теперь я понимаю ваш вопрос. Параметры должны храниться в памяти во время работы программы. Я не сохраняю их в файле конфигурации. –

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

+0

Да, тот же код, что и в вопросе, любопытно, что этот ответ принят. –

+0

Извините за это. Еще новичок в сайте. –

1

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

myForm.showdialog() 

вы не должны определить обработчик для кнопки закрытия события нажатия, она автоматически обрабатывается; просто установить 'DialogResult' свойство для кнопки

btnCancel.DialogResult = DialogResult.Cancel 

Кроме того, если вы хотите, чтобы закрыть форму, когда ESC нажимается затем установите 'CancelButton' свойство для формы:

myForm.CancelButton = btnCancel 

С другой стороны, если вы открываете форму, подобную форме:

myForm.Show() 

Вам необходимо указать действие (-и), чтобы выполнить закрытие bu tton click, как указано здесь:

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 

И только жгутов ОК sub, я вызываю My.Settings.

'Theme Section 
My.Settings.colorBtnBack = tempOptionsThemeLB_Back