Я создаю DataGrid, импортируя файл excel. Я хочу, чтобы пользователи вручную могли изменять имена столбцов из приложения.Пользовательский ввод для изменения текста заголовка столбца в DataGrid
Edit: Обход в нижней
Мой настольное приложение будет ниже логики:
- Загрузка файла Excel и таблицу отображения в DataGrid
- вручную изменить имена столбцов, чтобы соответствовать фиксированный текст. (ex Column «PricesZZZ» переименован в «Цены», «LeadTimeXXX to« LeadTime »)
- Экспорт DataGrid в новый шаблон excel с соответствующими столбцами, которые соответствуют фиксированному тексту (при этом необходимо иметь правильные имена ).
Excel файл может иметь несколько столбцов, и только некоторые из этих столбцов имеют соответствующую информацию, и единственный способ, чтобы идентифицировать их, чтобы соответствовать имя заголовка или какой-то другой способ есть пользователь «сказать» программу, которая столбец содержит какую информацию.
Мне нужно найти способ изменить имя столбца на основе ввода пользователем, поскольку я думаю, что это наиболее просто. Я новичок в C#, так что извините, если мое мышление немного назад.
Ниже приведен фрагмент кода, который у меня есть. Возможно, это не относится к этой конкретной проблеме, но может помочь визуализировать. Я использую библиотеку 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;
}
}
}
спасибо. Мне удалось найти решение для ducktape с полем ввода и изменить имена столбцов данных. Вы знаете, как я могу сделать то же самое с ItemsSource? – Trm
Жаль, что я слишком быстро опубликовал. Я сделал косметические изменения, щелкнув и изменив «DataGridColumnHeader.Content = input' [ref post] (http://stackoverflow.com/questions/5895803/how-do-i-capture-click-events-on-a-datagrid- колонка-заголовки). Однако, когда я повторяю столбцы 'foreach (столбец DataGridColumn в dataGrid.Columns)' Он по-прежнему показывает старое имя. Я могу использовать ваш подход для изменения заголовка текста 'column.Header = «New Header» ', но не знаете, как инициировать это событие из XAML при нажатии на определенный столбец. Надеюсь, это имеет смысл. – Trm
Проверьте здесь: http://stackoverflow.com/questions/33363181/use-textbox-in-column-header-c-sharp-wpf –