Как остановить выполнение кода, если не все опции выбраны в формах - PullRequest
0 голосов
/ 04 мая 2020

Я создаю простую форму, которая предлагает пользователю выбрать два радиоблока. Один из вариантов - это цвет, а другой - размер формы. Мне нужно создать код, который заставит пользователя выбирать и цвет, и размер, иначе с формой изменений не произойдет. Как бы я создал это? Пример, чтобы помочь.

Салли проверяет синий, но не выбирает размер формы и нажимает кнопку «Сохранить настройки формы». Она не должна ничего сохранять в форме, если только она не выберет размер формы. И наоборот, если она выбирает только размер, но без цвета, никакие изменения не должны выполняться, если не выбраны все параметры.

private void button1_Click(object sender, EventArgs e)
        {
            // changes color of form
            if (radioButton1.Checked)
            {
                this.BackColor = Color.Blue;
            }
            else if (radioButton2.Checked)
            {
                this.BackColor = Color.Red;
            }
            else
            {
                this.BackColor = Color.Yellow;
            }
            // changes size of form
            if (radioButton3.Checked)
            {
                this.Size = new System.Drawing.Size(500, 500);
            }
            else if (radioButton4.Checked)
            {
                this.Size = new System.Drawing.Size(750, 750);
            }
            // executing changes for small and large blue form
            if (radioButton1.Checked && radioButton3.Checked)
            {
                textBox1.Text = "A Small, Blue form";
            }
            else if (radioButton1.Checked && radioButton4.Checked)
            {
                textBox1.Text = "A Large, Blue form";
            }
            // executing changes for small and large red form
            if (radioButton2.Checked && radioButton3.Checked)
            {
                textBox1.Text = "A Small, Red form";
            }
            else if (radioButton2.Checked && radioButton4.Checked)
            {
                textBox1.Text = "A Large, Red form";
            }
            // executing changes for small and large yellow form (i accidently named the yellow radio button "yellow" and it wouldn't let me change it so thats why it looks funny)
            if (Yellow.Checked && radioButton3.Checked)
            {
                textBox1.Text = "A Small, Yellow form";
            }
            else if (Yellow.Checked && radioButton4.Checked)
            {
                textBox1.Text = "A Large, Yellow form";
            }
            // code so both selections have to be made
            if (radioButton1.Checked == false)
            {

            }
            else if (radioButton2.Checked == false)
            {

            }
            else
            {

            }
            if (radioButton3.Checked == false)
            {

            }
            else
            {

            }
        }

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

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

Я не уверен, как вы будете обрабатывать все эти элементы управления без использования GroupBox. Если вы используете GroupBox для группировки всех выпущенных RadioButton элементов управления, вы можете l oop над ними, используя групповую коробку.

Пример:

foreach(var control in groupbox.Controls)
{
    if(control is RadioButton)
    {
        var radio = control as RadioButton; 

        var name = radio.Name;

        if(radio.Checked) { ... }
    }

}

Вы можете сделать то же самое используя main Form в качестве контейнера, но это будет l oop по всем элементам управления формой, что не будет хорошей идеей.

Во-вторых, вы можете определить private методы, которые будут обрабатывать некоторые части кода, которые упростят обработку, например, метод для установки размера, другой для установки цвета, другой для получения сообщения для выбранного размера, и аналогично вы делаете то же самое для цвета. В конце концов, вы только передадите значение этим методам, а затем обработаете результаты, как хотите.

вот пример:

private System.Drawing.Size GetSize(string radioButtonName)
{
    switch(radioButtonName)
    {
        case "radioButton3":
            return new System.Drawing.Size(500, 500);
        case "radioButton4":
            return new System.Drawing.Size(750, 750);
        default: // set a default size
            return Size.Empty;
    }   
}

private Color GetColor(string radioButtonName)
{
    switch(radioButtonName)
    {
        case "radioButton1":
            return Color.Blue;
        case "radioButton2":
            return Color.Red;
        case "Yellow":
            return Color.Yellow;            
        default: // set a default color
            return Color.Empty;
    }   
}

private string GetSizeTextMessage(int width)
{
    switch(width)
    {
        case 500:
            return "Small";
        case 750:
            return "Large";
        default: 
            return null;
    }   
}

Теперь, с помощью этого, вы можете добавить или настроить любые параметры, которые вы хотите им. Затем, в вашем главном событии щелчка, вы можете сделать что-то вроде этого:

string sizeRadioName; 
string colorRadioName;

// changes color of form
if (radioButton1.Checked)
{
    colorRadioName = radioButton1.Name;
}
else if (radioButton2.Checked)
{
    colorRadioName = radioButton2.Name;
}

// changes size of form
if (radioButton3.Checked)
{
    sizeRadioName = radioButton3.Name;
}
else if (radioButton4.Checked)
{
    sizeRadioName = radioButton4.Name
}

if(size != Size.Empty && color != Color.Empty) { 

    this.Size  = GetSize(sizeRadioName);
    this.BackColor = GetColor(colorRadioName);
    textBox1.Text = $"A {GetSizeTextMessage(this.Size.Width)} , {this.BackColor.Name} form";        
}   

это для вашей текущей реализации, если вы использовали GroupBox, оно изменилось бы на что-то вроде этого:

Size size; 
Color color; 

foreach(var control in groupBoxExample.Controls)
{
    if(control.GetType() != typeof(RadioButton)) { continue; }

    var radio = control as RadioButton; 

    var name = radio.Checked ? radio.Name : null;

    if(name == null) { continue; }

    size  = GetSize(name);

    color = GetColor(name);
}

if(size != Size.Empty && color != Color.Empty) { 

    this.Size  = size;
    this.BackColor = color;
    textBox1.Text = $"A {GetSizeTextMessage(this.Size.Width)} , {this.BackColor.Name} form";        
}       

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

Надеюсь, это поможет вам.

0 голосов
/ 04 мая 2020

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

Например, если мы собирались установить цвет, мы могли бы сделать что-то вроде:

var color = Color.Empty;
if (rdoRed.Checked) color = Color.Red;
else if(rdoBlue.Checked) color = Color.Blue;
else if (rdoYellow.Checked) color = Color.Yellow;

Делая это, мы знаем, что если color == Color.Empty, то пользователь не выбрал цвет. Мы можем применить ту же логику c со свойством Size, а затем мы можем использовать условие if, чтобы убедиться, что ни одно из значений не пусто, прежде чем изменять размер формы.

троичный оператор (?:) может помочь сократить наш код:

private void btnApplyChanges_Click(object sender, EventArgs e)
{
    // Set this to the value they chose, or 'Empty' if no choice was made
    var color = rdoBlue.Checked ? Color.Blue 
        : rdoYellow.Checked ? Color.Yellow 
        : rdoRed.Checked ? Color.Red 
        : Color.Empty;

    // Set this to the value they chose, or 'Empty' if no choice was made
    var size = rdoSmall.Checked ? new Size(500, 500) 
        : rdoLarge.Checked ? new Size(750, 750) 
        : Size.Empty;

    // If neither value is empty, then change our form properties
    if (color != Color.Empty && size != Size.Empty)
    {
        // If we get this far, we know size was selected. So we choose the word "Small"
        // if the height is 500, otherwise "Large" (there are better ways to do this)
        var sizeText = size.Height == 500 ? "small" : "large";
        txtStatus.Text = $"A {sizeText}, {color.Name} form";
        BackColor = color;
        Size = size;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...