我通常没有将DataSource绑定到GridControl的问题。我通常是这样的:
myGrid.DataSource = myList // BindingList<ComplexObject>
colMyStrings.FieldName = "PropertyNameOfComplexObject";
它工作正常。我可以在网格中添加和删除行,它们将被添加到DataSource&#34; myList&#34;中。所以我基本上总是在我的列表中看到什么。
但是现在我没有List,Generic Type有属性,但是我有一个用字符串填充的List。
BindingList<string>
当我尝试将List绑定到我的网格时,它不会得到字符串本身是我想要绑定到我的列的行,因为字符串没有任何属性,我没有什么可以填充列.FielName用。
我知道我可以使用包装器类来解决这个问题,但是我觉得这个解决方案不是很好。
有没有办法告诉专栏,它应该使用的数据是对象,在这种情况下是字符串本身?
救援坦克。
UPDATE1 :
这是我尝试过的。我想如果我可以创建自己的GridControl并覆盖DataSource属性的setter,我可以创建一个内部Wrapper,以便任何使用它的人都不需要这样做。这种作品。我现在可以添加我的DataSource BindingList,但由于某种原因我无法编辑这些值。我不知道为什么。 这是代码:
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; }
}
}
}
UPDATE2: 我已经弄清楚为什么用户添加的对象不会得到任何东西。 当然它最重要的工作,因为向DataSource添加一个Object使用基本/空构造函数,这反过来意味着我的DataSource没有与原始List的连接,这是我想要新对象所在的那个。我将对此进行处理并再次更新。
UPDATE3: 无法想到任何更好的解决方案,所以我采用了初始方法并为我的字符串构建了一个包装类。看起来有点像这样:
class StringWrapper{
public String MyString{ get; set;}
}
myGrid.DataSource = new BindingList<StringWrapper>();
我仍然对其他方法的任何建议或想法感到高兴。
答案 0 :(得分:0)
您可以将"Column"
设为Column.FieldName
这是一个例子:
var myList = new List<string>() { "String 0", "String 1", "String 2" };
myGrid.DataSource = myList;
colMyStrings.FieldName = "Column";
但是,您无法添加或修改GridView
中的值,因为DevExpress团队未正确使用此案例,您只能删除值。
但是如果你想使用GridControl
来操作列表,那么你需要创建列表包装器,而不是字符串包装器。为此,您可以根据documentation实现允许IBindingList
的{{1}}接口。
以下是实现DataSource
接口的简单列表包装器的示例:
IBindingList
您可以按如下方式使用此包装:
public class ListWrapper<T> : IBindingList
{
private IList<T> _wrappedList;
public ListWrapper(IList<T> wrappedList)
{
_wrappedList = wrappedList;
}
#region IBindingList implementation
#region Necessary members
public object this[int index]
{
get { return new Wrapper(this, index); }//This wrapper have the Value property which is used as FieldName.
set { Insert(index, value); }
}
public object AddNew()
{
_wrappedList.Add(default(T));
return new Wrapper(this, Count - 1);
}
public void RemoveAt(int index)
{
_wrappedList.RemoveAt(index);
}
public int Count { get { return _wrappedList.Count; } }
public IEnumerator GetEnumerator()
{
return new ListWrapperEnumerator(this);
}
private class Wrapper
{
private readonly ListWrapper<T> _listWrapper;
private readonly int _index;
public Wrapper(ListWrapper<T> listWrapper, int index)
{
_listWrapper = listWrapper;
_index = index;
}
public T Value
{
get { return _listWrapper._wrappedList[_index]; }
set { _listWrapper._wrappedList[_index] = value; }
}
}
private class ListWrapperEnumerator : IEnumerator
{
private readonly ListWrapper<T> _listWrapper;
private int _currentIndex;
public ListWrapperEnumerator(ListWrapper<T> listWrapper)
{
_listWrapper = listWrapper;
Reset();
}
public object Current
{
get { return _listWrapper[_currentIndex]; }
}
public bool MoveNext()
{
return _currentIndex++ < _listWrapper.Count;
}
public void Reset()
{
_currentIndex = -1;
}
}
#endregion
#region Optional members
private bool GetValue(object value, out T result)
{
if (value is T)
{
result = (T)value;
return true;
}
var wrapper = value as Wrapper<T>;
if (wrapper != null)
{
result = wrapper.Value;
return true;
}
result = default(T);
return false;
}
public int Add(object value)
{
T result;
if (GetValue(value, out result))
{
_wrappedList.Add(result);
return _wrappedList.Count - 1;
}
return -1;
}
public void Clear()
{
_wrappedList.Clear();
}
public bool Contains(object value)
{
T result;
if (GetValue(value, out result))
return _wrappedList.Contains(result);
return false;
}
public void CopyTo(Array array, int index)
{
for (int listIndex = 0; listIndex < _wrappedList.Count; listIndex++)
{
int arrayIndex = listIndex + index;
if (arrayIndex >= array.Length)
return;
array.SetValue(_wrappedList[listIndex], arrayIndex);
}
}
public int IndexOf(object value)
{
T result;
if (GetValue(value, out result))
return _wrappedList.IndexOf(result);
return -1;
}
public void Insert(int index, object value)
{
T result;
if (GetValue(value, out result))
_wrappedList.Insert(index, result);
}
public void Remove(object value)
{
T result;
if (GetValue(value, out result))
_wrappedList.Remove(result);
}
#endregion
#region Settings
public bool AllowEdit { get { return true; } }
public bool AllowNew { get { return true; } }
public bool AllowRemove { get { return true; } }
public bool IsFixedSize { get { return false; } }
public bool IsReadOnly { get { return false; } }
public bool SupportsChangeNotification { get { return false; } }
public bool SupportsSearching { get { return false; } }
public bool SupportsSorting { get { return false; } }
#endregion
#region Not used members
public void AddIndex(PropertyDescriptor property) { }
public void ApplySort(PropertyDescriptor property, ListSortDirection direction) { }
public int Find(PropertyDescriptor property, object key) { return -1; }
public void RemoveIndex(PropertyDescriptor property) { }
public void RemoveSort() { }
public bool IsSorted { get { return false; } }
public bool IsSynchronized { get { return false; } }
public ListSortDirection SortDirection { get { return default(ListSortDirection); } }
public PropertyDescriptor SortProperty { get { return null; } }
public object SyncRoot { get { return null; } }
public event ListChangedEventHandler ListChanged;
#endregion
#endregion
}