Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#Winforms-IF语句有问题_C#_If Statement - Fatal编程技术网

C#Winforms-IF语句有问题

C#Winforms-IF语句有问题,c#,if-statement,C#,If Statement,这就是我要做的。我有一张有几个复选框的表格。用户将选中其中的1个、2个或12个,然后单击一个按钮,然后根据选中的框会发生一些事情 private void checkBox1_CheckedChanged(object sender, EventArgs e) { if (checkBox1.Checked == true) { checkBox1.Tag = "IP"; Console.WriteL

这就是我要做的。我有一张有几个复选框的表格。用户将选中其中的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.tagone),同样的问题也会发生。似乎只有checkBox1.Tag可以正确设置,而其他checkBoxX.Tag变量都保持为null。即使我声明了单独的变量,然后试图在复选框中设置它们,无论我做什么,都只会设置checkBox1的变量


另外,这是使用if语句的好方法吗?我不需要它们。我可以把它们排成一行,这样单击按钮就可以遍历它下面的所有if语句吗?

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

您是否双击了每个复选框

还是双击其中一个,创建事件处理程序,然后为其他每个事件复制并更改该事件处理程序

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

this.checkBox1.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged);
这条线实际上连接了事件。如果没有这一行,您的复选框实际上不会响应任何内容

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

但您也可以自己添加这些行。我一直都是这样做的,所以设计师没有隐藏东西。在窗体的构造函数中,可以按以下方式键入它们:

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

编写一个更干净的代码将使事情变得更容易。一些建议:

  • 不要直接使用复选框,而是创建一个类(“CheckBoxConfigs.cs”),该类将具有与复选框功能相关的布尔/字符串标志(您的代码将更易于阅读/mantain)

  • 使所有复选框使用相同的处理程序(相同的“事件”函数),您可以在其中设置“CheckBoxConfigs.cs”标志(而不是使用“tag”属性,您将拥有一个具有处理标志的角色的类),而不是为24个CheckboxCheckedChanged函数创建代码


  • 在按钮的单击处理程序中使用一组if语句是一种很好的方法,而且您甚至不再需要使用Tag属性或处理checkbox checked事件,因为您正在检查checked属性

        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);
        }
    

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

    如果我选中第一个和第三个复选框(其
    标记
    属性为“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]
    

    我认为这与您想要的非常接近

    console.writeline(checkBox2.Tag)的功能将任何东西输出到控制台?不,没有。但是checkBox1.Tag有。这很奇怪。CheckBox2事件连接好了吗?调试代码时会发生什么?为什么要在选中的事件中设置
    .Tag
    ?是否有其他东西将
    .Tag
    设置为其他东西?为什么它不仅仅是编译时常量ant?是否需要根据用户单击复选框来动态设置标记属性?换句话说,您是否可以在表单设计器中为每个复选框设置标记(例如,复选框1具有标记属性“IP”,复选框2具有标记属性“RP”等)。除非表单上的其他功能需要将标记设置为null?首先,在WinForms designer中设置每个复选框的
    标记
    属性。如果不需要通过
    控制台.WriteLine
    输出某些内容,则您甚至不需要单个
    CheckChanged
    事件处理程序。只需使用或不使用pre-con即可基于
    CheckedProperty
    Tag
    属性我想这样做,但我想我需要更多地阅读类。我有点了解如何使用它们。我想数组在这里也可能有用?因为每个事件都相同,除了复选框确定的两个变量。@Flydog57当我删除代码中的CheckChanged处理程序时,我在Form1.Designer.cs中得到了一个错误。在代码中删除而不在属性窗口中设置通常会产生此错误。可能最好的方法是在属性窗口中清理处理程序,然后手动设置。是的,当设置处理程序时,设计器在他使用.designer.cs文件进行连接,并在常规的.cs文件中写入处理程序的外壳(供您修改)。如果仅在.cs文件中删除处理程序,则设计器文件中的代码引用的是不再存在的函数。您可以欺骗并(小心地)删除进行连接的行(
    someControl.CheckChanged+=new System.EventHandler(this.someControl\u CheckChanged)
    )。更好的方法是进入设计器的事件视图并从那里删除处理程序。我想这可能是我做错的,但当我输入“checkBox”时
    MyFile: [c:\somefolder\somefile.ext], Final Name: [C:\testing\MyDeptMyWork\CK120181105.pdf]
    MyFile: [c:\somefolder\somefile.ext], Final Name: [C:\testing\MyDeptMyWork\CK320181105.pdf]