C# 更改DataGrid中列标题文本的用户输入
我正在通过导入excel文件创建DataGrid。我希望用户能够手动更改应用程序中的列名 编辑:底部的变通方法 我的桌面应用程序将具有以下逻辑:C# 更改DataGrid中列标题文本的用户输入,c#,wpf,datagrid,C#,Wpf,Datagrid,我正在通过导入excel文件创建DataGrid。我希望用户能够手动更改应用程序中的列名 编辑:底部的变通方法 我的桌面应用程序将具有以下逻辑: 加载excel文件并在DataGrid中显示表格 手动更改列名以匹配固定文本。(e.x.栏“PricesZZ”改名为“Prices”,LeadTimeXXX改名为“LeadTime”) 将DataGrid导出到新的excel模板,其中只包含与固定文本匹配的相关列(因此需要有正确的 姓名) 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
属性。有关详细信息,请参见后期编辑。