У меня есть DataTable, который затем заполняется из файла CSV, с помощью DataGridView данные редактируются в памяти. Насколько я понимаю, программное редактирование данных должно выполняться в DataTable, где пользовательское редактирование выполняется через. DataGridView.
Однако когда я программно добавляю столбцы в DataTable, он не отражается автоматически в DataGridView, и я подозреваю, что обратное также верно.
Как вы держите эти два одновременно? Я думал, что идея привязки данных заключается в том, что это происходит автоматически ...
Вот соответствующий код настройки - WorksheetGridView
подклассы DataGridView
// Can access data directly
public DataTable data = new DataTable();
public WorksheetGridView()
{
InitializeComponent();
// Allow copying from table to clipboard
this.ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableWithoutHeaderText;
// TODO: how to allow both row and column selects?
//this.SelectionMode = DataGridViewSelectionMode.ColumnHeaderSelect;
// Load up a blank DataTable to hold user inputted data
int i;
const int numBlankRows = Config.Application.DefaultNumRows;
const int numBlankCols = Config.Application.DefaultNumCols;
// TODO: Figure out how to include this as a config variable
DBNull dfltCellContent = DBNull.Value;
DataRow tmpRow;
// Add columns - i used for naming
for (i = 0; i < numBlankCols; i++)
{
this.AddColumn(i);
}
// Add rows
for (i = 0; i < numBlankRows; i++)
{
tmpRow = this.data.NewRow();
// Fill cells with something (i.e. blank cells)
foreach (DataColumn col in this.data.Columns)
{
tmpRow[col.ColumnName] = DBNull.Value;
}
this.data.Rows.Add(tmpRow);
}
// Link data to the view
this.DataSource = this.data;
}
private void AddColumn(int colIndex)
{
// Adds a column to the data array
DataColumn tmpCol;
tmpCol = new DataColumn();
tmpCol.DataType = Type.GetType(Config.Application.DataType);
tmpCol.ColumnName = "C" + colIndex.ToString();
tmpCol.ReadOnly = false;
tmpCol.Unique = false;
tmpCol.AllowDBNull = true;
this.data.Columns.Add(tmpCol);
}
Бит, который не работает, позже, когда я вызываю AddColumn
, например, в этом коде для обработки вставки данных, разделенных табуляцией,
public void PasteToCells(string mode)
{
// TODO: Write paste code
int i;
if (Clipboard.ContainsText())
{
string clipBoardContent = Clipboard.GetText();
using (CsvReader pastedCsvReader = new CsvReader(
new StringReader(clipBoardContent), false, '\t'))
{
// TODO: If more rows/cols than in data table then expand accordingly
int numPastedCols = pastedCsvReader.FieldCount;
int currRowIndex, currColumnIndex;
GetSelectedInsertPoint(out currRowIndex, out currColumnIndex);
// Make space for columns if needed
if (mode == "insertcols")
{
int baseIndex = this.data.Columns.Count;
for (i = 0; i < numPastedCols; i++)
{
//this.Columns.Add
// TODO: Doesn't work yet - do you edit the DataGridView and reflect to DataTable or vise-versa?
this.AddColumn(baseIndex + i);
}
}
while (pastedCsvReader.ReadNextRecord())
{
// Make space for rows (row by row) if needed
if (mode == "insertrows")
{
this.data.NewRow();
// TODO: Add a row
}
// Populate the cells with valid pasted text
for (i = 0; i < numPastedCols; i++)
{
this.data.Rows[currRowIndex][currColumnIndex + i] = ConvertCellContent(pastedCsvReader[i]);
}
currRowIndex = currRowIndex + 1;
}
}
}
else
{
// TODO: Do nothing?
Console.WriteLine("No text on clipboard");
}
}
Я попробовал приведенный ниже пример, и он работает. Однако, когда я пытаюсь это сделать, горизонтальная полоса прокрутки кратковременно расширяется и сжимается, но таблица в подклассе DataGridView
не обновляется.
Однако столбец находится в DataTable
- например, я не могу добавить столбец с тем же именем, число столбцов также отражает дополнительные столбцы. Возможно, есть вариант конструктора, который может ограничить обновление DataGridView
?
Также хорошо работает добавление строк.
РЕШИТЬ:
Для AutoGeneratedColumns
было установлено значение false
в коде конструктора, несмотря на то, что оно было true
в диалоге свойств (и задано явно в коде). Начальные столбцы были сгенерированы программно и поэтому не должны были появляться, однако это не было обнаружено, поскольку код конструктора также продолжал генерировать столбцы «сконструированы в», которые первоначально использовались для отладки.
Мораль: проверьте автоматически сгенерированный код!
В дополнение к этому см. этот пост и этот пост