-1

私はおそらく質問を間違って言いましたが、説明するのは簡単です。

基本的に私のフォームにはボタンがあり、クリックすると OpenFileDialog 検索ボックスが開き、Excel ファイルを開くことができ、フォームのさまざまな datagridview ボックスに表示されます。その後、Excel ワークシートにデータを入力できます。ただし、私は初心者のプログラマーであるため、ボタンをもう一度クリックして OpenFileDialog を再度実行することによってのみ、これらのデータグリッドビューを更新できます。

これは、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

DialogResult.OKプロパティの設定を確認した後、Excelファイルを参照するTextBox(例:ExcelFileTextBox)が必要だと思います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);
}

HTH

于 2018-08-20T05:05:01.653 に答える
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 に答える