本机类型绑定源/如何用字符串列表填充DevExpress GridControl?

问题描述 投票:0回答:1

通常,将数据源绑定到GridControl时没有问题。我通常是这样的:

myGrid.DataSource = myList // BindingList<ComplexObject>
colMyStrings.FieldName = "PropertyNameOfComplexObject";

并且工作正常。我可以从网格中添加和删除行,它们将被添加到数据源“ myList”中或从中删除。所以我基本上总是看到清单中的内容。

但是现在我没有List<ComplexObject>,通用类型具有属性,但是我有一个用字符串填充的列表。

BindingList<string>

[当我尝试将List绑定到网格时,不会得到字符串本身就是我想要绑定到列的行的内容,并且由于string没有任何属性,因此我无法填充列[ C0] with。

我知道我可以使用包装器类来解决此问题,但是我发现此解决方案不是很好。

是否有方法告诉列,它应使用的数据是对象,在这种情况下为字符串本身?

更新1

这是我尝试过的。我以为,如果我可以制作自己的GridControl并重写DataSource属性的设置器,则可以制作一个内部包装器,以便使用它的任何人都不需要这样做。这种作品。我现在可以添加.FieldName,但是由于某种原因我无法编辑这些值。我不知道为什么。

这里是代码:

DataSource BindingList<string>

更新2

我已经弄清楚了为什么用户添加的对象不会得到任何东西。当然,这是行不通的,因为将一个Object添加到DataSource使用了basic / empty构造函数,这又意味着我的DataSource没有与原始List的连接,这就是我希望新对象成为的对象输入。我将对此进行处理,然后再次更新。

更新3

无法想到更好的解决方案,因此我采用了最初的方法,并为我的字符串构建了一个包装器类。看起来有点像这样:

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; }
        }
    }
}

我仍然很乐意使用另一种方法。

c# devexpress datasource gridcontrol
1个回答
0
投票

您可以将class StringWrapper{ public String MyString{ get; set;} } myGrid.DataSource = new BindingList<StringWrapper>(); 设置为"Column"。这是示例:

© www.soinside.com 2019 - 2024. All rights reserved.