-1

我可能错误地措辞了这个问题,但它更容易解释。

基本上在我的表单上,我有一个按钮,如果你点击它,它会打开一个 OpenFileDialog 搜索框,你可以打开一个 excel 文件,它会显示在表单中的各种 datagridview 框中。然后您可以将数据输入到 Excel 工作表中。然而,因为我是一个新手程序员,我只能通过再次单击按钮并再次通过 OpenFileDialog 来更新那些 datagridview。

这是我最初用来阅读 excel 工作表的代码。

private void button18_Click(object sender, EventArgs e)
{
    using (OpenFileDialog ofd = new OpenFileDialog() { Filter = "Excel Workbook|*.xlsx", ValidateNames = true })
    {
        if (ofd.ShowDialog() == DialogResult.OK)
        {
            FileStream fs = File.Open(ofd.FileName, FileMode.Open, FileAccess.Read);
            IExcelDataReader reader = ExcelReaderFactory.CreateOpenXmlReader(fs);
            reader.IsFirstRowAsColumnNames = true;
            result = reader.AsDataSet();

            cboSheet.Items.Clear();
            cboSheet_mirror.Items.Clear();
            resultSheet.Items.Clear();

            foreach (System.Data.DataTable dt in result.Tables)
            {
                cboSheet.Items.Add(dt.TableName);
                cboSheet_mirror.Items.Add(dt.TableName);
                resultSheet.Items.Add(dt.TableName);
            }
            reader.Close();
        }
(...)

cboSheet 和 resultSheets 不相关,它们只是我用来导航不同工作表的东西。

我想要做的是创建一个方法,它使用编辑的 excel 工作表更新 datagridview,但用户不必每次都通过 OpenFileDialog 进程,程序只知道 excel 文件的路径。

希望这是有道理的。

4

2 回答 2

0

记住文件路径的最简单方法是在用户成功选择文件后将其保存在类成员中:

string currentFilePath {get;set;} //Class member that will hold the path

private void button18_Click(object sender, EventArgs e)
{
    using (OpenFileDialog ofd = new OpenFileDialog() { Filter = "Excel Workbook|*.xlsx", ValidateNames = true })
    {
        if (ofd.ShowDialog() == DialogResult.OK)
        {
            this.currentFilePath = ofd.FullName; //remember the path here

            (...)

然后在类中的任何其他方法或事件处理程序中,您可以读取该路径并再次打开 excel 文件,而无需另一个文件选择过程:

private void someOtherButton_Click(object sender, EventArgs e)
{ 
     //read the file from the remembered path
     FileStream fs = File.Open(this.currentFilePath, FileMode.Open, FileAccess.Read);
     IExcelDataReader reader = ExcelReaderFactory.CreateOpenXmlReader(fs);
     (...)

有关此主题的更多信息,我建议阅读一些关于Variable scopes

于 2018-08-17T07:58:28.700 回答
0

我认为您应该有一个 TextBox -例如 ExcelFileTextBox- 在其中浏览您的 Excel 文件,在检查DialogResult.OK设置其Text属性后,这还将通知用户有关 Excel 路径和文件名的信息。
您应该将 Excel 读取数据移至私有方法,如下所示:

private void ReadExcelData(string filename)
{
    FileStream fs = File.Open(filename, FileMode.Open, FileAccess.Read);
    IExcelDataReader reader = ExcelReaderFactory.CreateOpenXmlReader(fs);
    reader.IsFirstRowAsColumnNames = true;
    result = reader.AsDataSet();

    cboSheet.Items.Clear();
    cboSheet_mirror.Items.Clear();
    resultSheet.Items.Clear();

    foreach (System.Data.DataTable dt in result.Tables)
    {
        cboSheet.Items.Add(dt.TableName);
        cboSheet_mirror.Items.Add(dt.TableName);
        resultSheet.Items.Add(dt.TableName);
    }

    reader.Close();
}

您的浏览按钮代码将变为:

private void button18_Click(object sender, EventArgs e)
{
    using (OpenFileDialog ofd = new OpenFileDialog() { Filter = "Excel Workbook|*.xlsx", ValidateNames = true })
    {
        if (ofd.ShowDialog() == DialogResult.OK)
        {
            ExcelFileTextBox.Text = ofd.FileName;
            ReadExcelData(ofd.FileName);
         }
    }
}

然后添加一个刷新按钮,它也ReadExcelData像这样调用:

private void RefreshButton_Click(object sender, EventArgs e)
{
    ReadExcelData(ExcelFileTextBox.Text);
}

高温高压

于 2018-08-20T05:05:01.653 回答