Изменение события кнопки после нажатия кнопки в C # - PullRequest
0 голосов
/ 30 декабря 2011

У меня есть форма для навигации по веб-странице и доступа к данным.Это выглядит примерно так:

 private void LoginButton_Click(object sender, EventArgs e)
    {
        if(LoginButton.Text == Login)
        {
                LoginButton.Text = "Logging in...";
                ....
                ...
                Login process goes here...
                ..
                if(Login Successed)
                {
                    LoginButton.Text ="Download";
                }
                else
                {
                    LoginButton.Text = "Login";
                }
        }
        else if(LoginButton.Text==Download)
        {
            Download data here...
        }
    }

Та же кнопка (и то же событие тоже), выполняет два процесса и выглядит как разные события с меткой.1) Если есть какие-либо проблемы, как неэффективность запуска?2) Есть ли альтернативные способы сделать это, как различные схемы флагов?3) Есть ли способ иметь более одного события для одной и той же кнопки, чтобы достичь одной и той же идеи?

Спасибо.

Ответы [ 5 ]

2 голосов
/ 30 декабря 2011

1) Если есть какие-либо проблемы, такие как неэффективность запуска?

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

2) Есть ли альтернативные способы сделать это, например, различные схемы флагов?

Использование свойства «Текст» кнопки хрупко, ваш код сломается, когда кто-нибудь решит изменить текст кнопки или когда вы локализуете свое приложение на другой язык.Простое приватное поле bool в вашем классе намного лучше.

3) Любой способ иметь более одного события для одной и той же кнопки для достижения той же идеи?

Нет.Конечно, вы можете использовать две кнопки, расположенные друг над другом, и одна из них всегда скрыта.Упрощает локализацию, и вы получаете это поле bool бесплатно.

1 голос
/ 30 декабря 2011

Запись пользовательских обработчиков событий для mouseClick

Напишите отдельные методы для входа в систему и загрузки.

Регистрация пользовательских обработчиков событий для события нажатия кнопки

Я предполагаю, что есть некоторая логика, которая решает, что текст кнопки должен быть "скачать" или "войти". В этот момент, конечно, установите текст кнопки, но также зарегистрируйте соответствующий обработчик события.

Это позволит вам иметь одну кнопку, которая делает что угодно

protected void Login_MouseClickHandler (object obj ,MouseClickEventArgs e) {
    // login logic
    // this would be the logic you say is "inside the login button"
}

protected void Download_MouseClickHandler (object obj ,MouseClickEventArgs e) {
    // download logic
}


// pseudo code
// note that there is only one button
if process is login then
    theButton.text = "login"
    theButton.MouseClick += new MouseClickEventHandler(Login_MouseClickHandler)
else  
   button.text = "download"
   theButton.MouseClick += new MouseClickEventHandler (Download_MouseClickHandler)
end if

Мысли о разработке программного обеспечения

  • Проще продлить. Нам не нужна еще одна кнопка для каждого нового действия
  • Разделение проблем - например, весь код входа в систему выполняется отдельным методом, который только выполняет вход в систему.
  • Изменения изолированы и сведены к минимуму. Написание новых отдельных методов менее подвержено ошибкам, чем встраивание этого кода в структуру if else. И, следовательно, структура if else остается простой и понятной.
1 голос
/ 30 декабря 2011

, как сказал Дэниел А. Уайт, есть две кнопки

может быть на каком-то событии, например, oncreate / onload do check..jst псевдокод

 if process is login then
 do 
   //then showLoginButton
    btnlogin.visible

 else
     //download
    btndonload.visible

внутри кнопки входа в систему

        if(Login Successed)
            {
                 btndonload.visible
            }
            else
            {
                LoginButton.Text = "Login";
            }

это может быть лучше с двумя кнопками, чем с одной ... и чище также

0 голосов
/ 30 декабря 2011

Используйте контейнеры управления, такие как Panel и GroupBox. У вас может быть целая куча панелей для управления в разных состояниях.

0 голосов
/ 30 декабря 2011

Обычно плохая идея использовать текст в качестве состояния. В идеале у вас должно быть 2 кнопки, которые запускают разные события и вызывают основную логику для докладчика в шаблоне MVP.

...