2017-02-21 24 views
0

ExcelのファイルをインポートしてDataGridを作成しています。私はユーザーがアプリケーションからカラム名を手動で変更できるようにしたい。DataGridの列ヘッダーのテキストを変更するユーザー入力

編集:手動で固定テキストと一致するように列名を変更

  • のDataGrid
    1. ロードは、ファイルおよび表示テーブルをエクセル:下

      私のデスクトップアプリでの回避策は論理の下にあります。

    2. DataGridを固定テキストと一致する関連する列のみを含む新しいExcelテンプレートにエクスポートします(したがって、正確な の名前が必要です)。

    Excelファイルが複数の列と列のみのいくつかは、関連する情報を持っており、それらを識別するための唯一の方法は、ユーザーが列が情報を保持しているプログラムを「伝える」しているヘッダ名またはいくつかの他の方法を一致させることであることができます。

    私はそれが最も簡単だと思うので、ユーザーの入力に基づいて列名を変更する方法を見つける必要があります。少し後ろに。

    以下は、私がこれまで持っていたコードスニペットです。この特定の問題には関係ないかもしれませんが、視覚化に役立つかもしれません。私はEPPlusライブラリを使用

    インポートエクセル

    private void btnOpenXL_Click(object sender, RoutedEventArgs e) 
    { 
        // Create OpenFileDialog 
        Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog(); 
    
    
    
        // Set filter for file extension and default file extension 
        dlg.DefaultExt = ".xls"; 
        dlg.Filter = "Excel Files|*.xlsx;*.xls;*.xlsm;*.csv"; 
    
    
        // Display OpenFileDialog by calling ShowDialog method 
        Nullable<bool> result = dlg.ShowDialog(); 
    
    
        // Get the selected file name 
        if (result == true) 
        { 
         // Open document 
         string filename = dlg.FileName; 
    
         //call another class to draw the table 
         dataGrid.ItemsSource = GetDataTableFromExcel(filename).DefaultView; 
         MessageBox.Show("import done"); 
        } 
    } 
    
    public static DataTable GetDataTableFromExcel(string path, bool hasHeader = true) 
    { 
        using (var pck = new OfficeOpenXml.ExcelPackage()) 
        { 
         using (var stream = File.OpenRead(path)) 
         { 
          pck.Load(stream); 
         } 
         var ws = pck.Workbook.Worksheets.First(); 
         DataTable tbl = new DataTable(); 
         foreach (var firstRowCell in ws.Cells[1, 1, 1, ws.Dimension.End.Column]) 
         { 
          tbl.Columns.Add(hasHeader ? firstRowCell.Text : string.Format("Column {0}", firstRowCell.Start.Column)); 
         } 
         var startRow = hasHeader ? 2 : 1; 
         for (int rowNum = startRow; rowNum <= ws.Dimension.End.Row; rowNum++) 
         { 
          var wsRow = ws.Cells[rowNum, 1, rowNum, ws.Dimension.End.Column]; 
          DataRow row = tbl.Rows.Add(); 
          foreach (var cell in wsRow) 
          { 
           row[cell.Start.Column - 1] = cell.Text; 
          } 
         } 
         return tbl; 
        } 
    } 
    

    エクスポートエクセル

    private void btnExportToXL_Click(object sender, RoutedEventArgs e) 
    { 
        DataTable dataTable = new DataTable(); 
        dataTable = ((DataView)dataGrid.ItemsSource).ToTable(); 
        ExportDataTableToExcel(dataTable); 
        MessageBox.Show("export done"); 
    } 
    
    public void ExportDataTableToExcel(DataTable dataTable) 
    { 
        string path = "C:\\test"; 
        var newFile = new FileInfo(path + "\\" + 
               DateTime.Now.Ticks + ".xlsx"); 
        using (ExcelPackage pck = new ExcelPackage(newFile)) 
        { 
         ExcelWorksheet ws = pck.Workbook.Worksheets.Add("Sheet1"); 
         ws.Cells["A1"].LoadFromDataTable(dataTable, true); 
         pck.Save(); 
         System.Diagnostics.Process.Start(newFile.ToString()); 
        } 
    } 
    

    EDIT:データグリッドの任意のセルをダブルクリックして

    回避策:

    private void dataGrid_MouseDoubleClick(object sender, RoutedEventArgs e) 
    { 
        if (dataGrid.SelectedIndex == -1) //if column selected, cant use .CurrentColumn property 
        { 
         MessageBox.Show("Please double click on a row"); 
        } 
        else 
         { 
         DataGridColumn columnHeader = dataGrid.CurrentColumn; 
         if (columnHeader != null) 
         { 
          string input = Interaction.InputBox("Title", "Prompt", "Default", 0, 0); 
          columnHeader.Header = input; 
         } 
        } 
    } 
    

    答えて

    0

    datagridviewの列名を変更できます。ただし、この変更はグリッドに限られており、データソースではありません。あなたは、このコード形式のユーザーがヘッダー名を提供し、入力のテキスト変更イベントのボタンクリックイベントを呼び出すことができます

    dataGrid.Columns[i].HeaderText = "New Column Name"; //i is the index of the column 
    

    :だから一言で言えば、シンプルな表現の目的のためには、次のコードを使用することができます。また、事前に列名を使用している場合は、データソースがグリッドにバインドされた直後に列ヘッダーを新しい値に置き換えることができます。この行の後のヘッダーを変更してください:

    dataGrid.ItemsSource = GetDataTableFromExcel(filename).DefaultView; 
    //Set new column names here 
    
    +0

    ありがとうございます。私は、入力ボックスとデータグリッドの列名を変更して解決策をとらえることができました。 ItemsSourceに同じことをどうやって行えるか知っていますか? – Trm

    +0

    申し訳ありません投稿するには速すぎました。私は、クリックして 'DataGridColumnHeader.Content = input'を変更することで美観を変えました。[ref post](http://stackoverflow.com/questions/5895803/how-do-i-capture-click-events-on-a-datagrid-列ヘッダー)。しかし、 'foreach(DataGrid.ColumnsのDataGridColumnカラム)の列を反復処理すると、まだ古い名前が表示されます。私はあなたのアプローチを使用して、ヘッダーテキスト '列を変更することができます。Header = "New Header"ですが、特定の列をクリックしたときにXAMLからこのイベントを開始する方法がわかりません。それが理にかなってほしい。 – Trm

    +0

    ここをクリック:http://stackoverflow.com/questions/33363181/use-textbox-in-column-header-c-sharp-wpf –

    関連する問題