C# 为什么可以';我的IList实现不能用作数据源
我想将我的对象C# 为什么可以';我的IList实现不能用作数据源,c#,objectdatasource,C#,Objectdatasource,我想将我的对象任务集合绑定到我的复选框taskCollection实现接口IList 当我尝试将它用作数据源时,我得到了错误 System.ArgumentException:复杂数据绑定接受IList或IListSource作为数据源 这是我的TaskCollection: using System; using System.Collections.Generic; using System.IO; namespace CLBatchGUI { /// <summary>
任务集合
绑定到我的复选框
taskCollection
实现接口IList
当我尝试将它用作数据源时,我得到了错误
System.ArgumentException:复杂数据绑定接受IList或IListSource作为数据源
这是我的TaskCollection
:
using System;
using System.Collections.Generic;
using System.IO;
namespace CLBatchGUI
{
/// <summary>
/// Description of TaskCollection.
/// </summary>
public class TaskCollection:IList<Task>
{
private List<Task> _tasks;
public TaskCollection()
{
_tasks = new List<Task>();
}
public void executeTasks(){
}
public static void loadFromCSV(string path){
}
public void saveToCSV(string path){
StreamWriter sw= new StreamWriter(path);
saveToCSV(sw);
}
public void saveToCSV(TextWriter sw){
if(_tasks.Count==0)
throw new ApplicationException("There are no tasks to save");
foreach (var Task in _tasks) {
Task.validate();
}
try{
sw.Write("TaskName,");
for(int i=0;i<_tasks[0].job.parameters.Count;i++){
sw.Write(_tasks[0].job.parameters[i].Name);
if(i==_tasks.Count-1)
sw.Write("\n");
else
sw.Write(",");
}
for(int i=0;i<_tasks.Count;i++){
sw.Write(_tasks[i].Name +",");
for(int n=0;n<_tasks[i].job.parameters.Count;n++){
sw.Write(_tasks[i].job.parameters[n].Text);
if(n==_tasks[i].job.parameters.Count-1)
sw.Write("\n");
else
sw.Write(",");
}
}
}catch(Exception ex){
throw new ApplicationException(ex.Message);
}
}
public Task this[int index]{
get{
return _tasks[index];
}
set{
_tasks[index]=value;
}
}
public int Count {
get {
return _tasks.Count;
}
}
public bool IsReadOnly {
get {
return false;
}
}
public int IndexOf(Task item)
{
return _tasks.IndexOf(item);
}
public void Insert(int index, Task item)
{
_tasks.Insert(index,item);
}
public void RemoveAt(int index)
{
_tasks.RemoveAt(index);
}
public void Add(Task item)
{
_tasks.Add(item);
}
public void Clear()
{
_tasks.Clear();
}
public bool Contains(Task item)
{
return _tasks.Contains(item);
}
public void CopyTo(Task[] array, int arrayIndex)
{
_tasks.CopyTo(array,arrayIndex);
}
public bool Remove(Task item)
{
return _tasks.Remove(item);
}
public IEnumerator<Task> GetEnumerator()
{
return _tasks.GetEnumerator();
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return _tasks.GetEnumerator();
}
}
}
使用系统;
使用System.Collections.Generic;
使用System.IO;
命名空间CLBatchGUI
{
///
///TaskCollection的说明。
///
公共类任务集合:IList
{
私有列表任务;
公共任务集合()
{
_任务=新列表();
}
public void executeTasks(){
}
公共静态void loadFromCSV(字符串路径){
}
公共void saveToCSV(字符串路径){
StreamWriter sw=新StreamWriter(路径);
saveToCSV(西南);
}
公共void saveToCSV(TextWriter sw){
如果(_tasks.Count==0)
抛出新的ApplicationException(“没有要保存的任务”);
foreach(var任务在_任务中){
Task.validate();
}
试一试{
sw.Write(“任务名”);
对于(int i=0;i,您的类必须实现IList
或IListSource
,错误消息告诉您
您发布的类实现了IList
,但不是IList
因此,您必须自己实现IList
。您可以显式地实现,这样您就不会意外地添加一个对象
,而该对象不是任务
(因为非泛型的添加
方法将被隐藏),只要不显式地将TaskCollection
强制转换为IList
并调用非泛型的Add
方法
public class TaskCollection : IList<Task>, IList
{
int IList.Add(object value)
{
// just call the generic version
Add((Task)value);
}
int IList.IndexOf(object value)
{
// just call the generic version
return IndexOf((Task)value);
}
...
}
公共类任务集合:IList,IList
{
int IList.Add(对象值)
{
//只需调用通用版本
添加((任务)值);
}
int IList.IndexOf(对象值)
{
//只需调用通用版本
返回IndexOf((任务)值);
}
...
}
错误消息告诉您,您的类必须实现IList
或IListSource
您发布的类实现了IList
,但不是IList
因此,您必须自己实现IList
。您可以显式地实现,这样您就不会意外地添加一个对象
,而该对象不是任务
(因为非泛型的添加
方法将被隐藏),只要不显式地将TaskCollection
强制转换为IList
并调用非泛型的Add
方法
public class TaskCollection : IList<Task>, IList
{
int IList.Add(object value)
{
// just call the generic version
Add((Task)value);
}
int IList.IndexOf(object value)
{
// just call the generic version
return IndexOf((Task)value);
}
...
}
公共类任务集合:IList,IList
{
int IList.Add(对象值)
{
//只需调用通用版本
添加((任务)值);
}
int IList.IndexOf(对象值)
{
//只需调用通用版本
返回IndexOf((任务)值);
}
...
}
错误消息告诉您,您的类必须实现IList
或IListSource
您发布的类实现了IList
,但不是IList
因此,您必须自己实现IList
。您可以显式地实现,这样您就不会意外地添加一个对象
,而该对象不是任务
(因为非泛型的添加
方法将被隐藏),只要不显式地将TaskCollection
强制转换为IList
并调用非泛型的Add
方法
public class TaskCollection : IList<Task>, IList
{
int IList.Add(object value)
{
// just call the generic version
Add((Task)value);
}
int IList.IndexOf(object value)
{
// just call the generic version
return IndexOf((Task)value);
}
...
}
公共类任务集合:IList,IList
{
int IList.Add(对象值)
{
//只需调用通用版本
添加((任务)值);
}
int IList.IndexOf(对象值)
{
//只需调用通用版本
返回IndexOf((任务)值);
}
...
}
错误消息告诉您,您的类必须实现IList
或IListSource
您发布的类实现了IList
,但不是IList
因此,您必须自己实现IList
。您可以显式地实现,这样您就不会意外地添加一个对象
,而该对象不是任务
(因为非泛型的添加
方法将被隐藏),只要不显式地将TaskCollection
强制转换为IList
并调用非泛型的Add
方法
public class TaskCollection : IList<Task>, IList
{
int IList.Add(object value)
{
// just call the generic version
Add((Task)value);
}
int IList.IndexOf(object value)
{
// just call the generic version
return IndexOf((Task)value);
}
...
}
公共类任务集合:IList,IList
{
int IList.Add(对象值)
{
//只需调用通用版本
添加((任务)值);
}
int IList.IndexOf(对象值)
{
//只需调用通用版本
返回IndexOf((任务)值);
}
...
}
参考资料:@Shoe:一个更好的参考资料:这可能不会是一个问题,但有没有办法强迫T成为任务?@DominicKexel如果我实现IList,我必须实现一系列将T作为泛型类型的方法。我不希望使用TaskCollection的人使用Task以外的任何类型。很可能我不理解imp限制泛型类型接口已经足够好了。@Ukemi不,如果你实现了BTIList
,你必须实现一系列方法,这些方法不使用Task
,而是使用object
。但是我在这里看到了你的问题。请看我的更新。参考资料:@Shoe:一个更好的参考:这可能不会是一个问题,但是对于C来说有什么问题吗T是任务吗?@DominicKexel如果我实现IList,我必须实现一系列使用T作为泛型类型的方法。我不希望任何使用TaskCollection的人使用Task以外的任何类型。很可能我对实现泛型类型接口的理解不够。@Ukemi不,如果你实现IListIList
你必须实现不是一堆不使用任务
,而是使用对象
的方法