C#Winforms-IF语句出现问题

时间:2018-11-05 16:31:30

标签: c# if-statement

这就是我想要做的。我有一个带有多个复选框的表格。用户将检查其中的1个或2个或12个,然后单击一个按钮,然后根据选中的框将发生几件事。

    private void checkBox1_CheckedChanged(object sender, EventArgs e)
    {
        if (checkBox1.Checked == true)
        {
            checkBox1.Tag = "IP";
            Console.WriteLine(checkBox1.Tag);
        }
        else
        {
            checkBox1.Tag = null;
        }
    }
    private void CheckBox2_CheckedChanged(object sender, EventArgs e)
    {
        if (checkBox2.Checked == true)
        {
            checkBox2.Tag = "PR";
            Console.WriteLine(checkBox2.Tag);
        }
        else
        {
            checkBox2.Tag = null;

        }
    }

所以,这只是我在此表单上拥有的24个复选框中的2个代码的示例。用户单击按钮后,表单将使用checkboxX.Tag变量保存文件:

        private void button2_Click(object sender, EventArgs e)
    {

        if (string.IsNullOrWhiteSpace(myFile) &
            string.IsNullOrWhiteSpace(selectDate) &
            string.IsNullOrWhiteSpace(selectDept))
        {
            MessageBox.Show("Well, that didn't work. Check your info and try again!");
            return;
        }
        else File.Exists(myFile);
        {
            MessageBox.Show("Document(s) added! " + selectDept + selectWorker +
              " for " + dateTime.Year + "-" + dateTime.Month + "-" + dateTime.Day);
            MessageBox.Show("To add more docs, re-open this program");
            if (checkBox1.Checked)
            {
                string finalName = @"C:\testing\" + selectDept + selectWorker + @"\" + 
                  checkBox1.Tag + dateTime.Year + dateTime.Month + dateTime.Day + ".pdf";
                textBox2.Text = finalName;
                File.Copy(myFile, finalName, true);
            }
            if (checkBox2.Checked)
            {
                string finalName = @"C:\testing\" + selectDept + selectWorker + @"\" + 
                  checkBox2.Tag + dateTime.Year + dateTime.Month + dateTime.Day + ".pdf";
                textBox2.Text = finalName;
                File.Copy(myFile, finalName, true);
            }

因此,就目前而言,它适用于第一个复选框,并且仅适用于第一个复选框。就像,该文件将按照预期的方式进行复制和保存,但是没有5个相同的文件,分别名为“ IP20181012”,“ PR20181012”,“ FS20181012”等等,我最终得到了一个名为“ IP20181012”的文件,然后另一个文件名为“ 20181012”,使我相信从未设置过checkBox2.Tag变量。我尝试使用一个单独的变量(内置的checkBox1.Tag除外),并且发生了完全相同的问题。似乎只有checkBox1.Tag会正确设置,而其他checkBox X .Tag变量都保持为空。即使我声明了单独的变量,然后尝试在复选框中进行设置,无论我做什么,都只会设置用于checkBox1的变量。

此外,这是使用if语句的一种好方法吗?我不需要它们嵌套。我是否可以将它们排成一排,以便单击按钮即可遍历其下的所有if语句?

4 个答案:

答案 0 :(得分:1)

按钮的单击处理程序中的一堆if语句是执行此操作的好方法。而且您甚至不需要使用Tag属性或处理复选框已选中的事件,因为无论如何都在检查选中的属性。

    if (checkBox1.Checked)
    {
        string finalName = @"C:\testing\" + selectDept + selectWorker + @"\IP"
            + dateTime.Year + dateTime.Month + dateTime.Day + ".pdf";
        textBox2.Text = finalName;
        File.Copy(myFile, finalName, true);
    }
    if (checkBox2.Checked)
    {
        string finalName = @"C:\testing\" + selectDept + selectWorker + @"\PR"
          + dateTime.Year + dateTime.Month + dateTime.Day + ".pdf";
        textBox2.Text = finalName;
        File.Copy(myFile, finalName, true);
    }

答案 1 :(得分:0)

您如何为这些复选框创建事件处理程序?

您是否双击了每个复选框?

还是您双击了一个,创建了事件处理程序,然后将其复制并更改为另一个?

您看不到的是,在代码隐藏文件(MyForm.Designer.cs)中,每个事件处理程序都有一行如下所示:

this.checkBox1.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged);

这是实际连接事件的那条线。没有这一行,您的复选框实际上将不会响应任何内容。

如果您是从VB6或VBA开始的,那么会有些混乱,因为在这些语言中,仅创建具有正确名称的方法会神奇地导致这种连接。但是在C#(和VB .NET)中,它是显式的,即使它可能隐藏在Designer文件中。

但是您也可以自己添加这些行。这是我一直这样做的方式,因此设计器没有隐藏任何东西。在表单的构造函数中,您可以通过以下方式输入它们:

public MyForm()
{
    checkBox1.Checked += checkBox1_Checked;
    checkBox2.Checked += checkBox2_Checked;
    [etc.]
}

答案 2 :(得分:0)

编码更简洁的代码将使事情变得更容易。一些建议:

  1. 而不是直接使用您的复选框,而是创建一个类(“ CheckBoxConfigs.cs”,其中将包含有关复选框功能的布尔/字符串标志(您的代码将更易于阅读/维护);

    < / li>
  2. 使所有复选框都使用相同的处理程序(相同的“事件”功能),您可以在其中设置“ CheckBoxConfigs.cs”标志(而不是使用“ tag”属性,而使用具有该角色的类)来处理标志),而不是为24个CheckBox_CheckedChanged函数创建代码;

答案 3 :(得分:0)

首先将设计器中每个复选框的Tag属性设置为所需的字符串。然后,摆脱CheckChanged处理程序。最后,在您的按钮处理程序中执行类似的操作(我进行了明显的修改(例如我不叫File.Copy)):

 private void button2_Click(object sender, EventArgs e)
 {
     var selectDept = "MyDept";
     var selectWork = "MyWork";
     var myFile = @"c:\somefolder\somefile.ext";
     var dateTime = DateTime.Now;

     var formattedDate1 = dateTime.ToString("yyyy-MM-dd");
     var formattedDate2 = dateTime.ToString("yyyyMMdd");
     MessageBox.Show($"Document(s) added {selectDept}{selectWork} for {formattedDate1}");
     var checkboxes = new[]
     {
         checkBox1,
         checkBox2,
         checkBox3,
         //you get the idea
     };
     foreach (var checkbox in checkboxes)
     {
         if (checkbox.Checked)
         {
             var finalName = $@"C:\testing\{selectDept}{selectWork}\{checkbox.Tag}{formattedDate2}.pdf";
             textBox1.Text = finalName;      //no sure what this is for
             Debug.WriteLine($"MyFile: [{myFile}], Final Name: [{finalName}]");
         }
     }
 }

如果我选中第一个和第三个复选框(它们的Tag属性是“ CK1”和“ CK2”,则在输出中得到以下内容:

MyFile: [c:\somefolder\somefile.ext], Final Name: [C:\testing\MyDeptMyWork\CK120181105.pdf]
MyFile: [c:\somefolder\somefile.ext], Final Name: [C:\testing\MyDeptMyWork\CK320181105.pdf]

我认为这很接近您想要的