用户输入以更改DataGrid中的列标题文本

时间:2017-02-21 16:32:57

标签: c# wpf datagrid

我通过导入excel文件创建DataGrid。我希望用户手动能够从应用程序中更改列名。

编辑:底部的解决方法

我的桌面应用程序将具有以下逻辑:

  1. 在DataGrid中加载Excel文件和显示表
  2. 手动更改列名以匹配固定文本。 (e.x.专栏" PriceZZZ"重命名为"价格"," LeadTimeXXX改为" LeadTime")
  3. 将DataGrid导出到新的Excel模板,只包含与固定文本匹配的相关列(因此需要具有正确的 名)。
  4. Excel文件可以有多个列,只有其中几列具有相关信息,识别它们的唯一方法是匹配标题名称或其他方式有用户"告诉"列中包含哪些信息的程序。

    我需要找到一种方法来根据用户输入更改列名,因为我认为它最直接。我是c#的新手,很抱歉,如果我的想法有点倒退。

    以下是我到目前为止的代码段。可能与此特定问题无关,但可能有助于可视化。我使用EPPlus库

    导入Excel

    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;
        }
    }
    

    导出excel

    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());
        }
    }
    

    修改

    双击datagrid中的任何单元格进行解决方法:

    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;
            }
        }
    }
    

1 个答案:

答案 0 :(得分: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