我有一个专门针对 DataGridViewCell 的类,并以不同的方式处理绘制。它还需要重写 GetPreferredSize 函数来为要绘制的内容请求合适的尺寸。 Paint 函数获取“value”和“formattedValue”作为参数,但 GetPreferredSize 函数仅获取 rowIndex。
我想知道检索单元格值的正确方法(计算最佳大小所必需的)。
如果我理解正确的话,我应该避免做这样的事情:
text = (string)this.DataGridView.Rows[rowIndex].Cells[this.ColumnIndex].Value;
以避免取消共享行。可能相关:我在虚拟模式下使用 DataGridView。
这个怎么样?
text = (string)this.DataGridView.CurrentCell.Value;
要获取单元格的值而不取消共享行,需要访问底层
DataSource
。
例如为了一个
DataTable
DataGridView dgv = ...;
DataTable table = (DataTable) dgv.DataSource;
DataView dv = table.DefaultView;
int numVisibleRows = dv.Count;
int rowIndex = ...;
int colIndex = ...; // this has to be mapped based on DisplayIndex
List<DataGridViewColumn> columns = dgv.Columns.Cast<DataGridViewColumn>().Where(t => t.Visible).OrderBy(t => t.DisplayIndex).ToList();
colIndex = columns[colIndex].Index;
DataRowView drv = dv[rowIndex];
Object value = drv[colIndex];
这就得到了价值。如果目标是获得显示的值(即
FormattedValue
),那么它可以在一定程度上完成。从 InheritedStyle
获取 DataGridViewColumn
并应用 Format
将给出一个不错的近似值。但是,显示的文本可能会因行高或列宽而被截断。