将DataTable转换为ObservableCollection(没有特定的类)

时间:2014-12-15 16:50:20

标签: c# wpf datatable observablecollection

我想在我的解决方案中在ObservableCollection 中转换DataTable而不需要特定的类。 (stackoverflow.com中的所有其他解决方案都是特定的类。)

原因是DataTable表示存储过程结果,并且将来我想更改存储过程结果而不对应用程序进行任何更改。

我无法直接绑定我的DataBale,因为我在ModelView端使用Filter,如果我一起使用DataTable和Filter,我会遇到异常。

有什么想法吗?

由于

目标是拥有相同的代码,但没有BO.Line对象。

    static public ObservableCollection<BO.Line> GetValues()
    {

        DataTable _dataTable = DAL.ExecuteStoredProcedure(GetStoredProcedureNameInAppConfig());

        ObservableCollection<BO.Line> _list = new ObservableCollection<BO.Line>();

        foreach (DataRow _dataRow in _dataTable.Rows)
        {
            _list.Add(new BO.Line() { Instrument = _dataRow["Instrument"].ToString(), 
                                      Crystal = _dataRow["Crystal"].ToString() });
        }

        return _list;
    }

在此示例中:

GetStoredProcedureNameInAppConfig() //return "GetLines"

但我想更改我的App.config(不重新编译我的应用程序):

GetStoredProcedureNameInAppConfig() //return "GetPerson"

“GetLines”存储过程返回:

Instrument | Crystal
______________________
Instr1     | Crystal1
Instr1     | Crystal2
Instr2     | Crystal1

“GetPerson”存储过程返回:

FirstName | LastName | Language
_______________________________
Alex      | Doe      | ENG
Britt     | Nillis   | ENG
Carlo     | Petro    | FR

恢复
我想在“泛型”ObservableCollection中转换DataTable(带有变量结构)。 没有具体的课程。
(ObservableCollection对我来说不是好办法。)

谢谢

1 个答案:

答案 0 :(得分:2)

此解决方案适用于WPF绑定和过滤。

Thank you to http://paulstovell.com/

public class GenericObject
{

    private readonly ObservableCollection<GenericProperty> properties = new ObservableCollection<GenericProperty>();

    public GenericObject(params GenericProperty[] properties)
    {
        foreach (var property in properties)
            Properties.Add(property);
    }

    public ObservableCollection<GenericProperty> Properties
    {
        get { return properties; }
    }

}

public class GenericProperty : INotifyPropertyChanged
{
    public GenericProperty(string name, object value)
    {
        Name = name;
        Value = value;
    }

    public string Name { get; private set; }
    public object Value { get; set; }


    public event PropertyChangedEventHandler PropertyChanged;
}

private static ObservableCollection<GenericObject> Convert(DataTable toConvert)
{
    ObservableCollection<GenericObject> _result = new ObservableCollection<GenericObject>();

    foreach (DataRow _row in toConvert.Rows)
    {
        GenericObject _genericObject = new GenericObject();
        foreach (DataColumn _column in toConvert.Columns)
        {
            _genericObject.Properties.Add(new GenericProperty(_column.ColumnName,_row[_column]));
        }
        _result.Add(_genericObject);
    }

    return _result;
}

谢谢大家的帮助。