Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更改DataGrid中列标题文本的用户输入_C#_Wpf_Datagrid - Fatal编程技术网

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

C# 更改DataGrid中列标题文本的用户输入,c#,wpf,datagrid,C#,Wpf,Datagrid,我正在通过导入excel文件创建DataGrid。我希望用户能够手动更改应用程序中的列名 编辑:底部的变通方法 我的桌面应用程序将具有以下逻辑: 加载excel文件并在DataGrid中显示表格 手动更改列名以匹配固定文本。(e.x.栏“PricesZZ”改名为“Prices”,LeadTimeXXX改名为“LeadTime”) 将DataGrid导出到新的excel模板,其中只包含与固定文本匹配的相关列(因此需要有正确的 姓名) Excel文件可以有多个列,其中只有几个列具有相关信息,识别这些

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

编辑:底部的变通方法

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

  • 加载excel文件并在DataGrid中显示表格
  • 手动更改列名以匹配固定文本。(e.x.栏“PricesZZ”改名为“Prices”,LeadTimeXXX改名为“LeadTime”)
  • 将DataGrid导出到新的excel模板,其中只包含与固定文本匹配的相关列(因此需要有正确的 姓名)
  • 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;
        }
    }
    
    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;
            }
        }
    }
    

    您可以更改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
    

    谢谢。我用输入框和更改datagrid列名成功地解决了这个问题。你知道我如何对ItemsSource做同样的操作吗?很抱歉,我发布得太快了。我通过单击并更改
    DataGridColumnHeader.Content=input
    。但是,当我迭代每个
    列时(dataGrid.Columns中的DataGridColumn列)
    它仍然显示旧名称。我可以使用您的方法更改标题文本
    column.header=“新建标题"
    ,但不确定如何在单击特定列时从XAML启动此事件。希望它有意义。请检查此处:很抱歉延迟回复。链接没有太大帮助,但我找到了解决方法,双击列中的任何单元格以获得列位置,使用
    dataGrid.CurrentColumn
    并使用
    dat启动列标题更改aGrid.CurrentColumn.Header=input
    。我仍然希望直接单击列,但如果单击,则它没有
    CurrentColumn
    属性。有关详细信息,请参见后期编辑。