Активация / деактивация кнопок из конфигурационного файла C# (WinForms)



Предположим, что в моей программе есть максимум 8 кнопок, и я должен иметь возможность включать/выключать их (видимые/скрытые) в соответствии с моими настройками в конфигурационном файле.
Выбранные мною кнопки должны быть видны в двух строках (если их больше 4) или в одной строке (cnt


<add key="butactive" value="1;3;4;8"/>
<add key="but1" value="START"/>
<add key="but2" value="END"/>
<add key="but3" value="PAUSE"/>
<add key="but4" value="RESET"/>
...


Программа должна уметь определите с помощью клавиши "butactive", какая из этих кнопок будет видна, а затем измените их текстовое свойство и добавьте конкретное действие, которое также берется из файла конфигурации.



 private void Form2_Load(object sender, EventArgs e)
{
radButton1.Text = ConfigurationManager.AppSettings["but1"];
radButton2.Text = ConfigurationManager.AppSettings["but2"];
radButton3.Text = ConfigurationManager.AppSettings["but3"];
radButton4.Text = ConfigurationManager.AppSettings["but4"];
...
radButton1.Click += getAction(ConfigurationManager.AppSettings["but1a"]);
radButton2.Click += getAction(ConfigurationManager.AppSettings["but2a"]);
...
}


Есть идеи, как выбрать нужные кнопки при загрузке формы и разместить их в нужных местах?

813   2  

2 ответов:

Вы можете использовать FlowLayoutPanel в качестве контейнера для ваших кнопок. Если вы правильно его размер все, что вам нужно сделать, это установить видимость кнопок, и они будут расположены так, как вам нужно:

radButton1.Visible = (bool)ConfigurationManager.AppSettings["butactive1"];
radButton2.Visible = (boll)ConfigurationManager.AppSettings["butactive2"];
...

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

radButton1.Click += buttonClickHandler;
radButton2.Click += buttonClickHandler;

private void buttonClickHandler(object sender, EventArgs e)
{
    var button = sender as Button;
    var action = getAction(ConfigurationManager.AppSettings[button.Text + "a"];

    //Execute whatever you want here based on action
}

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

Для позиции кнопок вы можете возиться с позициями, например, вы можете переключать кнопки 3 и 5, как это в windows forms:

radButton5.Position = radButton3.Position

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

Царапина (псевдокод) того, что вы должны сделать, будет выглядеть примерно так:

 // Get the active buttons from configuration (eg var will be a list of the active buttons names)
 var activeButtons = getActiveButtons();
 var textBoxNumber = 0
 foreach(var button in activeButtons)
 {
    textBoxNumber++;
    TextBox tbx = this.Controls.Find("radButton" + textBoxNumber.ToString(), true).FirstOrDefault() as TextBox;

    if(tbx != null)
       tbx.Text = ConfigurationManager.AppSettings[button];
 }

Comments

    Ничего не найдено.