【发布时间】:2021-02-02 07:22:28
【问题描述】:
我有一个IItemParameter 类型的接口,并且很少用泛型实例化它。
定义如下:
public interface IItemParameter
{
string Name { get; set; }
}
public struct ItemParameter<T> : IItemParameter
{
public string Name { get; set; }
private T _Default { get; set; }
public T Default { get => _Default; set => _Default = value; }
}
我实例化 ItemParameter<int> 和 ItemParameter<string> 和 ItemParameter<bool>。
我想在包含两列的 DataGridView 中显示这些类型的集合:Name 和 Value,其中 Name 是 Parameter 的 Name 属性,Value 显示为TextBoxCell (string/int) 或 CheckBoxCell(bool)
我使用BindingList<IItemParameter> 来存储参数,如下所示:
//Transform ObjectParameters into ItemParameters for display
foreach (var param in parameters)
{
if (param is ObjectParameter<bool>)
{
ObjectParameter<bool> boolParam = (ObjectParameter<bool>)param;
_bindingList.Add(new ItemParameter<bool> { Name = param.Name, Value = boolParam.Default });
}
if (param is ObjectParameter<string>)
{
ObjectParameter<string> stringParam = (ObjectParameter<string>)param;
_bindingList.Add(new ItemParameter<string> { Name = param.Name, Value = stringParam.Default });
}
if (param is ObjectParameter<int>)
{
ObjectParameter<int> intParam = (ObjectParameter<int>)param;
_bindingList.Add(new ItemParameter<int> { Name = param.Name, Value = intParam.Default });
}
}
dataGridView1.DataSource = _bindingList;
DataGridView 只显示第一列(名称)。
如何根据参数的类型显示带有单元格的第二列?
【问题讨论】:
-
DataGridView 单元格如何在同一列中显示
string、int和bool值的复选框?您可以重新定义您的接口,添加一个string Default {get; }属性并将_Default转换为该属性的getter 中的字符串。BindingList<IItemParameter>现在可以工作了,你不需要在类型之间切换,只需添加一个新的ItemParameter<Whatever>而不检查类型。当然,DGV 中显示的值都是只读字符串,除非您提供转换器。Converter<T>已经有了委托的通用定义。 -
当然,如果您想在 UI 中更改
_Default的值,您还需要一个自定义的 DataGridViewCell,它绘制属性的显示值和提供编辑它的方法(使用自定义EditingControl)。除非您可以将字符串值作为"True"和"False"接受bool类型属性。相反,如果这些值仅用于演示(只读),则无需执行任何其他操作。
标签: winforms datagridview