通常,将数据源绑定到GridControl时没有问题。我通常是这样的:
myGrid.DataSource = myList // BindingList<ComplexObject>
colMyStrings.FieldName = "PropertyNameOfComplexObject";
并且工作正常。我可以从网格中添加和删除行,它们将被添加到数据源“ myList”中或从中删除。所以我基本上总是看到清单中的内容。
但是现在我没有List<ComplexObject>
,通用类型具有属性,但是我有一个用字符串填充的列表。
BindingList<string>
[当我尝试将List绑定到网格时,不会得到字符串本身就是我想要绑定到列的行的内容,并且由于string没有任何属性,因此我无法填充列[ C0] with。
我知道我可以使用包装器类来解决此问题,但是我发现此解决方案不是很好。
是否有方法告诉列,它应使用的数据是对象,在这种情况下为字符串本身?
这是我尝试过的。我以为,如果我可以制作自己的GridControl并重写DataSource属性的设置器,则可以制作一个内部包装器,以便使用它的任何人都不需要这样做。这种作品。我现在可以添加.FieldName
,但是由于某种原因我无法编辑这些值。我不知道为什么。
这里是代码:
DataSource BindingList<string>
我已经弄清楚了为什么用户添加的对象不会得到任何东西。当然,这是行不通的,因为将一个Object添加到DataSource使用了basic / empty构造函数,这又意味着我的DataSource没有与原始List的连接,这就是我希望新对象成为的对象输入。我将对此进行处理,然后再次更新。
无法想到更好的解决方案,因此我采用了最初的方法,并为我的字符串构建了一个包装器类。看起来有点像这样:
public partial class NativeTypeGrid : DevExpress.XtraGrid.GridControl
{
public NativeTypeGrid()
{
InitializeComponent();
}
public override object DataSource
{
get
{
return base.DataSource;
}
set
{
if (value is IBindingList)
{
Type GenericType;
IBindingList myList = (IBindingList) value;
BindingList<Wrapper> wrappedList = new BindingList<Wrapper>();
GenericType = myList.GetType().GetGenericArguments()[0];
if(GenericType.IsPrimitive || GenericType == typeof(string))
{
for(int i = 0; i < myList.Count; i++)
{
object obj = myList[i];
wrappedList.Add(new Wrapper(ref obj));
}
base.DataSource = wrappedList;
}
else
{
base.DataSource = value;
}
}
else
{
base.DataSource = value;
}
}
}
internal class Wrapper
{
private object _NativeTypeProperty;
public Wrapper()
{
_NativeTypeProperty = "SomeValueForInitialization";
}
public Wrapper(ref object nativeType)
{
_NativeTypeProperty = nativeType;
}
public object NativeTypeProperty
{
get { return _NativeTypeProperty; }
set { _NativeTypeProperty = value; }
}
}
}
我仍然很乐意使用另一种方法。
您可以将class StringWrapper{
public String MyString{ get; set;}
}
myGrid.DataSource = new BindingList<StringWrapper>();
设置为"Column"
。这是示例: