关闭外部Excel应用程序之前禁用C#表单

关闭外部Excel应用程序之前禁用C#表单,c#,excel,csv,C#,Excel,Csv,我在C#Windows窗体应用程序上有一个按钮,它运行以下代码: private void btnAddDataToCSV_Click(object sender, EventArgs e) { string path = "D:\MyCsvFile.csv"; Process.Start(path); } 基本上,用户需要能够对CSV文件进行更改。用户在MicrosoftExcel中进行这些更改时最舒服。我在网上从一位有多年微软办公产品和C

我在C#Windows窗体应用程序上有一个按钮,它运行以下代码:

private void btnAddDataToCSV_Click(object sender, EventArgs e)
    {
    string path = "D:\MyCsvFile.csv";
    Process.Start(path);
    }
基本上,用户需要能够对CSV文件进行更改。用户在MicrosoftExcel中进行这些更改时最舒服。我在网上从一位有多年微软办公产品和C#工作经验的人那里找到了上述代码。这家伙解释说,下面的代码可以工作,但比上面所示的使用“Process.Start()”更容易出错

string path = "D:\MyCsvFile.csv";
var ExcelApp = new Excel.Application();
ExcelApp.Workbooks.OpenText(path, Comma: true);

ExcelApp.Visible = true;
这家伙解释说,“Process.Start()”之所以有效,是因为Windows设置为使用Excel作为打开CSV文件的默认程序

无论如何,当用户单击上面的按钮(btnaddatatocsv)时,我需要禁用我的C#form(所有按钮都灰显),直到用户关闭显示CSV文件的Excel工作簿。在用户关闭Excel后,我可能需要C#程序立即读取CSV文件

我该怎么做

我想。。。我需要做一些像。。。“禁用C#表单…然后等待Excel关闭事件…然后一旦Excel关闭事件发生…启用C#表单并读取CSV文件。”

下面是我用来读取CSV文件的代码:

string path = "D:\MyCsvFile.csv";

var reader = new StreamReader(File.OpenRead(path));

List<string> listA = new List<string>();
List<string> listB = new List<string>();
List<string> listC = new List<string>();

while (!reader.EndOfStream)
{
    var line = reader.ReadLine();
    var values = line.Split(',');

    listA.Add(values[0]);
    listB.Add(values[1]);
    listC.Add(values[2]);
}
string path=“D:\MyCsvFile.csv”;
var reader=newstreamreader(File.OpenRead(path));
List listA=新列表();
List listB=新列表();
List listC=新列表();
而(!reader.EndOfStream)
{
var line=reader.ReadLine();
var值=行分割(',');
listA.Add(值[0]);
列表B.添加(值[1]);
添加(值[2]);
}

我认为您需要为退出的进程使用事件处理程序

大概是这样的:

private void btnAddDataToCSV_Click(object sender, EventArgs e)
{
//disable form

string path = "D:\MyCsvFile.csv";

using (myProcess = new Process())
 {
   myProcess.EnableRaisingEvents = true;
   myProcess.Exited += new EventHandler(Excel_Exit);
   myProcess.Start(path);   
 }

}


public void Excel_Exit(object sender, System.EventArgs e){
//enableForm
}

已退出文档中的示例:

我认为您需要为退出的流程使用事件处理程序

大概是这样的:

private void btnAddDataToCSV_Click(object sender, EventArgs e)
{
//disable form

string path = "D:\MyCsvFile.csv";

using (myProcess = new Process())
 {
   myProcess.EnableRaisingEvents = true;
   myProcess.Exited += new EventHandler(Excel_Exit);
   myProcess.Start(path);   
 }

}


public void Excel_Exit(object sender, System.EventArgs e){
//enableForm
}

进程。已退出文档中的示例:

我无法使上述解决方案工作,即使该解决方案与Microsoft的解决方案类似

我发现:

它说:

using(var process = new Process())
“我遇到过将新进程()放在using子句中的示例。如果要使用Exited功能,请不要这样做。using子句将销毁实例以及Exited上的任何事件句柄。”

它说:

using(var process = new Process())
应该是:

var process = new Process();
因为我为Microsoft提供的上面的链接是一个如何使用“Process.Exited事件”的示例,它使用“using(var Process=new Process()”,所以没有任何问题

但果不其然。。。由于某种原因,当我尝试“var process=new process();”时,它成功了。。。这是有效的代码:

private void btnAddDataToCSV_Click(object sender, EventArgs e)
{
    var myProcess = new Process();
       
    myProcess.EnableRaisingEvents = true;
    myProcess.Exited += new EventHandler(Excel_Exit);
    myProcess.StartInfo.FileName = "D:\\MyCsvFile.csv";
    myProcess.Start();        
}

public void Excel_Exit(object sender, System.EventArgs e)
{
    MessageBox.Show("Success!!");
}
下面是不起作用的代码。。。但我不明白为什么,因为这和微软的例子很相似

private Process myProcess;
private void btnAddDataToCSV_Click(object sender, EventArgs e)
{
    using (myProcess = new Process())
    {
        myProcess.EnableRaisingEvents = true;
        myProcess.Exited += new EventHandler(Excel_Exit);
        myProcess.StartInfo.FileName = "D:\\MyCsvFile.csv";
        myProcess.Start();
    }          
}

public void Excel_Exit(object sender, System.EventArgs e)
{
    MessageBox.Show("Success!!");
}

当您关闭excel时。。。事件从未发生过。。。有人能解释一下吗?当然,微软的例子没有错。

我无法让上面的解决方案工作,即使该解决方案与微软的解决方案类似

我发现:

它说:

using(var process = new Process())
“我遇到过将新进程()放在using子句中的示例。如果要使用Exited功能,请不要这样做。using子句将销毁实例以及Exited上的任何事件句柄。”

它说:

using(var process = new Process())
应该是:

var process = new Process();
因为我为Microsoft提供的上面的链接是一个如何使用“Process.Exited事件”的示例,它使用“using(var Process=new Process()”,所以没有任何问题

但果不其然。。。由于某种原因,当我尝试“var process=new process();”时,它成功了。。。这是有效的代码:

private void btnAddDataToCSV_Click(object sender, EventArgs e)
{
    var myProcess = new Process();
       
    myProcess.EnableRaisingEvents = true;
    myProcess.Exited += new EventHandler(Excel_Exit);
    myProcess.StartInfo.FileName = "D:\\MyCsvFile.csv";
    myProcess.Start();        
}

public void Excel_Exit(object sender, System.EventArgs e)
{
    MessageBox.Show("Success!!");
}
下面是不起作用的代码。。。但我不明白为什么,因为这和微软的例子很相似

private Process myProcess;
private void btnAddDataToCSV_Click(object sender, EventArgs e)
{
    using (myProcess = new Process())
    {
        myProcess.EnableRaisingEvents = true;
        myProcess.Exited += new EventHandler(Excel_Exit);
        myProcess.StartInfo.FileName = "D:\\MyCsvFile.csv";
        myProcess.Start();
    }          
}

public void Excel_Exit(object sender, System.EventArgs e)
{
    MessageBox.Show("Success!!");
}

当您关闭excel时。。。事件从未发生过。。。有人能解释一下吗?微软的例子肯定没有错。

我试图效仿你的例子,但我一直遇到问题。。。其中一个问题是:“无法使用实例引用访问成员;请改为使用类型名对其进行限定”,在“myProcess.Start(path)”上;“行…我不知道这个错误是什么意思?所以我把它改为:myProcess.StartInfo.FileName=“D:\\MyCsvFile.csv”;和myProcess.Start(path);它消除了所有的错误…但没有“灰色”掉我的C#表单上的按钮…这是我最初发布的关于尝试完成的。另外,上面写着“//enableForm”“我输入代码以显示消息框。。。但当我关闭excel工作簿时,没有显示任何消息框。我已经打开了其他excel工作簿,但从未关闭过。我不知道这是不是原因?今晚我会做更多的测试。。。但是,如果需要更多的指导,您必须将我的评论(//disable form)替换为禁用所有要变灰的元素。我想你可以把你的Buttonname.Enable=False(或类似的东西)。对于关闭事件,您必须关闭所有excel选项卡,因为您的代码将打开它。因此,您可以尝试:1)关闭所有excel选项卡,2)启动程序3)单击按钮(检查excel打开)4)检查禁用的元素5)关闭excel 6)检查元素是否再次启用(在这里,您必须用启用的元素替换我的//enableForm)尝试遵循您的示例,但我一直遇到问题。。。其中一个问题是:“无法使用实例引用访问成员;请改为使用类型名对其进行限定”,在“myProcess.Start(path)”上;“行…我不知道这个错误是什么意思?所以我把它改为:myProcess.StartInfo.FileName=“D:\\MyCsvFile.csv”;和myProcess.Start(path);它消除了所有的错误…但没有“灰色”掉我的C#表单上的按钮…这是我最初发布的关于尝试完成的。另外,上面写着“//enableForm”“我输入代码以显示消息框。。。但当我关闭excel工作簿时,没有显示任何消息框。我已经打开了其他excel工作簿,但从未关闭过。我不知道这是否是最重要的