2017-02-21 40 views
0

Я создаю DataGrid, импортируя файл excel. Я хочу, чтобы пользователи вручную могли изменять имена столбцов из приложения.Пользовательский ввод для изменения текста заголовка столбца в DataGrid

Edit: Обход в нижней

Мой настольное приложение будет ниже логики:

  1. Загрузка файла Excel и таблицу отображения в DataGrid
  2. вручную изменить имена столбцов, чтобы соответствовать фиксированный текст. (ex Column «PricesZZZ» переименован в «Цены», «LeadTimeXXX to« LeadTime »)
  3. Экспорт 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; 
     } 
    } 
} 

ответ

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

спасибо. Мне удалось найти решение для ducktape с полем ввода и изменить имена столбцов данных. Вы знаете, как я могу сделать то же самое с ItemsSource? – Trm

+0

Жаль, что я слишком быстро опубликовал. Я сделал косметические изменения, щелкнув и изменив «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

+0

Проверьте здесь: http://stackoverflow.com/questions/33363181/use-textbox-in-column-header-c-sharp-wpf –