我有一个使用数据绑定的DataGridView,手动创建的列,这很好。
但是我希望行的BackColor也是数据绑定的,到目前为止我的尝试都遇到了错误。
这是我最近的尝试:
dataGridFileTransfer.RowHeadersVisible = false;
dataGridFileTransfer.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
dataGridFileTransfer.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridFileTransfer.MultiSelect = false;
dataGridFileTransfer.ReadOnly = true;
var files = GetReceivedFiles(false).Union(FileDetails.Select(FileStatus.FailedVerification)).ToList();
dataGridFileTransfer.AutoGenerateColumns = false;
string[] displayHeaders = new string[] { COL_NAME, COL_TYPE, COL_CREATED, COL_SIZE, COL_STATUS };
string[] displayProps = new string[] { "Filename", "FileTypeDisplayName", "Created", "Size", "FileStatus" };
for (int i = 0; i < displayHeaders.Length; i++)
{
DataGridViewTextBoxColumn col = new DataGridViewTextBoxColumn();
col.HeaderText = displayHeaders[i];
col.DataPropertyName = displayProps[i];
if (displayHeaders[i] == COL_CREATED)
col.DefaultCellStyle.Format = Constants.DDMMYYYHHMMSS;
dataGridFileTransfer.Columns.Add(col);
}
Binding bi = new Binding("DefaultCellStyle.BackColor", files, "DisplayColor");
dataGridFileTransfer.DataBindings.Add(bi);
dataGridFileTransfer.DataSource = files;
生成ArguementException:
“无法绑定到该属性 “DefaultCellStyle.BackColor”上 目标控制。参数名称: 的PropertyName“
PropertyName的值是错误的,还是应该绑定到DataGridView以外的对象? (即一列?) 或者是PropertyName不能以X.Y形式出现的问题?我之前认为我曾经看过/使用过这种语法,但也许只适用于DataMember?
非常感谢任何帮助
答案 0 :(得分:1)
我认为问题是files.DisplayColor
。 files
是一个集合,没有属性DisplayColor
,但集合中的每个项目都有。所以你试图绑定一个不存在的属性。进一步的绑定集合DataGridView.DataBindings
允许您对控件的数据绑定属性,而不是其行的属性。所有行只有一个DataGridView.DefaultCellStyle.BackColor
。所以我相信你最终需要将每行的DefaultCellStyle
绑定到files
的相应项目,我不确定这是否可行。可能是DataGridView
根据需要创建和删除行 - 例如,如果执行过滤 - 这也会破坏数据绑定。
所以,我不确定是否可以使用数据绑定进行行着色,但我个人对此表示怀疑。这需要一些非常智能的逻辑识别'将绑定到此行的对象数据的属性DisplayColor
绑定到此行的属性DefaultCellStyle.BackColor
。'
你可以勉强实现这种智能数据绑定。虽然这将是一件好事,但它也将非常复杂。作为一个简单的解决方案,您可以使用RowPrepaint
事件为行设置正确的颜色。