我有一个dataGridView,它绑定到“kit”对象列表作为数据源。我编写了一个方法AddLocalizedStringColumn()
,添加了一个新的
指向datagrid(“Localized String
”)的列,并通过读取另一列(“stringCode
”)中的数据来填充它。如果列已存在,
它只是更新列的值。我已根据datagrid的数据源更改时间将此方法放在事件中。
调试器确认正确分配了所有单元格值,包括Cell.FormattedValue
。但是,在查看
第一次,列是空白的!即使在第一次加载期间运行两次,Localized String列仍为空白。如果我运行
初始绘制后第二次 AddLocalizedStringColumn
方法,无论是按钮还是按事件,它都会正确显示值。
我不确定为什么会这样。我只能想象它与dataGrid的初始绘制有关。
虽然实际代码是专有的,但这是一个类似的例子。
public static void AddLocalizedStringField(this DataGridView gridView, string localeStringIDProperty, string columnTitle, int valueIndex)
{
if (string.IsNullOrEmpty(localeStringIDProperty)) return;
if (string.IsNullOrEmpty(columnTitle)) return;
if (valueIndex < 0 || valueIndex >= gridView.Columns.Count) return;
if (gridView.Columns.Contains(localeStringIDProperty) == false) return;
if (gridView.Columns.Contains(columnTitle))
{
valueIndex = gridView.Columns.IndexOf(gridView.Columns[columnTitle]);
}
else
{
DataGridViewColumn newColumn = new DataGridViewColumn();
newColumn.Name = columnTitle;
newColumn.CellTemplate = new DataGridViewTextBoxCell();
gridView.Columns.Insert(valueIndex, newColumn);
}
int idIndex = gridView.Columns.IndexOf(gridView.Columns[localeStringIDProperty]);
foreach(DataGridViewRow row in gridView.Rows)
{
DataGridViewCell foundCell = row.Cells[columnTitle];
foundCell.Value = "English Text";
gridView.InvalidateCell(foundCell);
}
}
DataGridView dataGridViewStores = new DataGridView();
List<Store> _listOfStores = new List<Store>();
public void SetupForm() // Runs as part of the constructor
{
/* _listOfStores is filled with entries.*/
dataGridViewStores.DataSource = _listOfStores;
dataGridViewStores.AddLocalizedStringField("storeName", "translated name", 2);
// The column appears but is blank. The debugger shows all its cells have the correct contents.
}
public void RefreshColumn()
{
// Running this after the form is displayed shows the localized values correctly.
dataGridViewStores.AddLocalizedStringField("storeName", "translated name", 2);
}