C# 如何根据所选组合框声明路径?

C# 如何根据所选组合框声明路径?,c#,C#,我有名为TST-D0123、TST-D0245、TST-D0568的文件夹。此文件夹将列在组合框中。现在,我必须设置基于文件夹名称生成新DataFile.txt的路径。我该怎么做 这是组合框代码: private void comboBox2_SelectedIndexChanged(object sender, EventArgs e) { if ((string)comboBox2.SelectedItem == "TST-D0123") {

我有名为TST-D0123、TST-D0245、TST-D0568的文件夹。此文件夹将列在组合框中。现在,我必须设置基于文件夹名称生成新DataFile.txt的路径。我该怎么做

这是组合框代码:

private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
{
    if ((string)comboBox2.SelectedItem == "TST-D0123")
    {
        Path = $@"G:\Eng\Share\PC\TST-D0123\SSD\SN\D0123_DataFile.txt";
        logPath = $@"G:\Eng\Share\PC\TST-D0123\SSD\SystemLog\SystemLog_{DateTime.Now:yyyyMMdd-HHmm}.txt";

        generateFile()
    }
    else if ((string)comboBox2.SelectedItem == "TST-D0245")
    {
        Path = $@"G:\Eng\Share\PC\TST-D0245\SSD\SN\D0245_DataFile.txt";
        logPath = $@"G:\Eng\Share\PC\TST-D0245\SSD\SystemLog\SystemLog_{DateTime.Now:yyyyMMdd-HHmm}.txt";

        generateFile()
    }
    else 
    {
        Path = $@"G:\Eng\Share\PC\TST-D0568\SSD\SN\D0568_DataFile.txt";
        logPath = $@"G:\Eng\Share\PC\TST-D0568\SSD\SystemLog\SystemLog_{DateTime.Now:yyyyMMdd-HHmm}.txt";

        generateFile();
    }
    
}
这是生成新文件DataFile.txt的代码

private void generateFile()
{
    dbConnect();
    SqlCommand command_Data;
    SqlDataReader dataReader;
    String sql = "";

    sql = "SELECT TOP(1) start_rg, end_rg FROM Rg WHERE status = 'Avail' ";
    command_Data = new SqlCommand(sql, cnn);

    dataReader = command_Data.ExecuteReader();


    //how to set this path based on selected text in combobox?
    string Path = $@"G:\Eng\Share\PC\**foldername**\SSD\SN\**4char from foldername**_DataFile.txt";


    using (StreamWriter tw = File.CreateText(Path))
    {
        while (dataRead.Read())
        {
            tw.WriteLine("RG");
            tw.WriteLine("StartRG={0}", dataRead["start_rg"]);
            tw.WriteLine("EndRG={0}", dataRead["end_rg"]);
        }
    }
    dataReader.Close();
    command_Data.Dispose();
    
}

首先,由于文件夹名称是组合框中的项目,因此是SelectedItem,因此可以直接使用它创建
路径
日志路径
,而不是一组
if条件
和显式分配路径

比如说,

private void组合框2\u SelectedIndexChanged(对象发送方,事件参数e)
{
if(comboBox2.SelectedItem是字符串文件夹&&!string.IsNullOrEmpty(文件夹)&&文件夹包含(“-”)
{
Path=$@“G:\Eng\Share\PC\{folder}\SSD\SN\{folder.Split('-')[0]}\u DataFile.txt”;
logPath=$@“G:\Eng\Share\PC\{folder}\SSD\SystemLog\SystemLog{DateTime.Now:yyyyMMdd HHmm}.txt”;
generateFile(路径);//解释如下
}
}
您可以将Path变量直接传递给
GenerateFile
方法,因为创建两次路径没有意义

private void generateFile(string path)
{
    dbConnect();
    SqlCommand command_Data;
    SqlDataReader dataReader;
    String sql = "";

    sql = "SELECT TOP(1) start_rg, end_rg FROM Rg WHERE status = 'Avail' ";
    command_Data = new SqlCommand(sql, cnn);

    dataReader = command_Data.ExecuteReader();
    
    using (StreamWriter tw = File.CreateText(path))
    {
        while (dataRead.Read())
        {
            tw.WriteLine("RG");
            tw.WriteLine("StartRG={0}", dataRead["start_rg"]);
            tw.WriteLine("EndRG={0}", dataRead["end_rg"]);
        }
    }
    dataReader.Close();
    command_Data.Dispose();
}

只需将所选文件名传递给
generateMethod
。您需要将方法的签名更改为acept字符串。您的代码应该如下所示:

private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
{
    var folderName = comboBox2.SelectedItem.ToString();
    
    if (folderName == "TST-D0123")
    {
        Path = $@"G:\Eng\Share\PC\TST-D0123\SSD\SN\D0123_DataFile.txt";
        logPath = $@"G:\Eng\Share\PC\TST-D0123\SSD\SystemLog\SystemLog_{DateTime.Now:yyyyMMdd-HHmm}.txt";
    }
    else if (folderName == "TST-D0245")
    {
        Path = $@"G:\Eng\Share\PC\TST-D0245\SSD\SN\D0245_DataFile.txt";
        logPath = $@"G:\Eng\Share\PC\TST-D0245\SSD\SystemLog\SystemLog_{DateTime.Now:yyyyMMdd-HHmm}.txt";
    }
    else 
    {
        Path = $@"G:\Eng\Share\PC\TST-D0568\SSD\SN\D0568_DataFile.txt";
        logPath = $@"G:\Eng\Share\PC\TST-D0568\SSD\SystemLog\SystemLog_{DateTime.Now:yyyyMMdd-HHmm}.txt";
    }
    
    generateFile(folderName);
}

private void generateFile(string folderName)
{
    dbConnect();
    SqlCommand command_Data;
    SqlDataReader dataReader;
    String sql = "";

    sql = "SELECT TOP(1) start_rg, end_rg FROM Rg WHERE status = 'Avail' ";
    command_Data = new SqlCommand(sql, cnn);

    dataReader = command_Data.ExecuteReader();

    var fileName = folderName.Substring(0, 4);
    string Path = $@"G:\Eng\Share\PC\{foldername}\SSD\SN\{fileName}_DataFile.txt";


    using (StreamWriter tw = File.CreateText(Path))
    {
        while (dataRead.Read())
        {
            tw.WriteLine("RG");
            tw.WriteLine("StartRG={0}", dataRead["start_rg"]);
            tw.WriteLine("EndRG={0}", dataRead["end_rg"]);
        }
    }
    dataReader.Close();
    command_Data.Dispose();
    
}
从使用组合框的方法中可以看出,类似的逻辑可以应用于这个巨大的if,所有代码都可以大大简化。此外,我猜您希望从文件夹名称中提取5个字符,但这取决于您:

private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
{
    var folderName = comboBox2.SelectedItem.ToString();
    var fileName = folderName.Substring(0, 4);
    var Path = $@"G:\Eng\Share\PC\{foldername}\SSD\SN\{fileName}_DataFile.txt";
    var logPath = $@"G:\Eng\Share\PC\{foldername}\SSD\SystemLog\SystemLog_{DateTime.Now:yyyyMMdd-HHmm}.txt";
    
    generateFile(folderName);
}

您可以直接将
Path
参数传递到
generateFile()
函数中

您还可以将文件夹变量直接分配到字符串中,而不是使用大量if-else语句为每个变量添加硬编码路径

示例:

private void组合框2\u SelectedIndexChanged(对象发送方,事件参数e)
{
如果(comboBox2.SelectedItem)是字符串文件夹
&&!string.IsNullOrEmpty(文件夹))
{
//Get FolderName(获取文件夹名称在“-”之后的一部分)
字符串folderName=文件夹.Split('-')[1];
//将变量插入folderPath
字符串路径=$@“G:\Eng\Share\PC\{folder}\SSD\SN\{folderName}\u DataFile.txt”;
//在日志路径中插入变量
字符串logPath=$@“G:\Eng\Share\PC\{folder}\SSD\SystemLog
+\SystemLog{DateTime.Now:yyyyMMdd HHmm}.txt”;
生成文件(路径);
}
}
生成文件方法:

private void generateFile(字符串路径)
{
.....
}