Konwertuj listę ogólną do zbioru danych w C#

Mam ogólną listę obiektów. Każdy obiekt posiada 9 Właściwości łańcuchowych. Chcę przekształcić tę listę w zbiór danych, który mogę przekazać do datagridview......Jak najlepiej to zrobić?

Author: Timothy Carter, 2009-08-07

10 answers

Próbowałeś powiązać listę bezpośrednio z datagridview? Jeśli nie, spróbuj najpierw, ponieważ zaoszczędzi ci to wiele bólu. Jeśli już próbowałeś, powiedz nam, co poszło nie tak, abyśmy mogli lepiej Ci doradzić. Powiązanie danych daje różne zachowanie w zależności od interfejsów implementowanych przez obiekt danych. Na przykład, jeśli twój obiekt danych implementuje tylko IEnumerable (np. List), otrzymasz bardzo podstawowe Wiązanie jednokierunkowe, ale jeśli implementuje również IBindingList (np. BindingList, DataView), wtedy ty zdobądź Wiązanie dwukierunkowe.

 13
Author: Christian Hayter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-07 16:23:52

Przepraszam za udzielenie odpowiedzi na to pytanie, ale pomyślałem, że będzie to najprostszy sposób na wyświetlenie mojego ostatecznego kodu. Zawiera poprawki dla typów nullable i wartości null: -)

    public static DataSet ToDataSet<T>(this IList<T> list)
    {
        Type elementType = typeof(T);
        DataSet ds = new DataSet();
        DataTable t = new DataTable();
        ds.Tables.Add(t);

        //add a column to table for each public property on T
        foreach (var propInfo in elementType.GetProperties())
        {
            Type ColType = Nullable.GetUnderlyingType(propInfo.PropertyType) ?? propInfo.PropertyType;

            t.Columns.Add(propInfo.Name, ColType);
        }

        //go through each property on T and add each value to the table
        foreach (T item in list)
        {
            DataRow row = t.NewRow();

            foreach (var propInfo in elementType.GetProperties())
            {
                row[propInfo.Name] = propInfo.GetValue(item, null) ?? DBNull.Value;
            }

            t.Rows.Add(row);
        }

        return ds;
    }
 60
Author: Bennett Dill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-15 15:36:17

Jest błąd z kodem rozszerzenia Lee powyżej, musisz dodać nowo wypełniony wiersz do tabeli t podczas iteracji przez elementy z listy.

public static DataSet ToDataSet<T>(this IList<T> list) {

Type elementType = typeof(T);
DataSet ds = new DataSet();
DataTable t = new DataTable();
ds.Tables.Add(t);

//add a column to table for each public property on T
foreach(var propInfo in elementType.GetProperties())
{
    t.Columns.Add(propInfo.Name, propInfo.PropertyType);
}

//go through each property on T and add each value to the table
foreach(T item in list)
{
    DataRow row = t.NewRow();
    foreach(var propInfo in elementType.GetProperties())
    {
            row[propInfo.Name] = propInfo.GetValue(item, null);
    }

    //This line was missing:
    t.Rows.Add(row);
}


return ds;

}

 12
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-27 12:12:15

Można utworzyć metodę rozszerzenia, aby dodać wszystkie wartości właściwości poprzez odbicie:

public static DataSet ToDataSet<T>(this IList<T> list)
{
    Type elementType = typeof(T);
    DataSet ds = new DataSet();
    DataTable t = new DataTable();
    ds.Tables.Add(t);

    //add a column to table for each public property on T
    foreach(var propInfo in elementType.GetProperties())
    {
        t.Columns.Add(propInfo.Name, propInfo.PropertyType);
    }

    //go through each property on T and add each value to the table
    foreach(T item in list)
    {
        DataRow row = t.NewRow();
        foreach(var propInfo in elementType.GetProperties())
        {
            row[propInfo.Name] = propInfo.GetValue(item, null);
        }
    }

    return ds;
}
 5
Author: Lee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-07 16:26:29

You may want to check out

Http://www.codeproject.com/KB/vb/List2DataSet.aspx

Daje kilka różnych podejść.

 3
Author: Kelly Gendron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-07 16:18:36

Brute force kod do odpowiedzi na twoje pytanie:

DataTable dt = new DataTable();

//for each of your properties
dt.Columns.Add("PropertyOne", typeof(string));

foreach(Entity entity in entities)
{
  DataRow row = dt.NewRow();

  //foreach of your properties
  row["PropertyOne"] = entity.PropertyOne;

  dt.Rows.Add(row);
}

DataSet ds = new DataSet();
ds.Tables.Add(dt);
return ds;
Teraz pytanie. Dlaczego chcesz to zrobić? Jak wspomniano wcześniej, możesz powiązać bezpośrednio z listą obiektów. Może narzędzie do raportowania, które pobiera tylko zbiory danych?
 2
Author: joshua.ewer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-07 16:20:37

Sam napisałem małą bibliotekę, aby wykonać to zadanie. Używa odbicia tylko po raz pierwszy typ obiektu ma być przetłumaczony na datatable. Emituje metodę, która wykona całą pracę nad tłumaczeniem typu obiektu.

To najszybsze rozwiązanie, jakie znam (dlatego je opracowałem :-) ). Znajdziesz go tutaj: ModelShredder na GoogleCode

Obecnie obsługuje tylko tłumaczenie na DataTable. Jak sformułował Pan swoje pytanie, powinno to wystarczyć. Wsparcie dla Datasetów (pomyśl o prostym odwrotnym ORM) jest już rozwinięte, zostanie wydane w dwóch wersjach, kiedy wrócę z wakacji :-)

 2
Author: Johannes Rudolph,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-07 16:24:01

Nieco zmodyfikowałem akceptowaną odpowiedź, obsługując typy wartości. Natknąłem się na to, gdy próbowałem wykonać następujące czynności, a ponieważ GetProperties() ma zerową długość dla typów wartości, otrzymywałem pusty zestaw danych. Wiem, że nie jest to przypadek użycia dla OP, ale pomyślałem, że opublikuję tę zmianę w przypadku, gdyby ktoś inny natknął się na to samo.

Enumerable.Range(1, 10).ToList().ToDataSet();

public static DataSet ToDataSet<T>(this IList<T> list)
{
    var elementType = typeof(T);
    var ds = new DataSet();
    var t = new DataTable();
    ds.Tables.Add(t);

    if (elementType.IsValueType)
    {
        var colType = Nullable.GetUnderlyingType(elementType) ?? elementType;
        t.Columns.Add(elementType.Name, colType);

    } else
    {
        //add a column to table for each public property on T
        foreach (var propInfo in elementType.GetProperties())
        {
            var colType = Nullable.GetUnderlyingType(propInfo.PropertyType) ?? propInfo.PropertyType;
            t.Columns.Add(propInfo.Name, colType);
        }
    }

    //go through each property on T and add each value to the table
    foreach (var item in list)
    {
        var row = t.NewRow();

        if (elementType.IsValueType)
        {
            row[elementType.Name] = item;
        }
        else
        {
            foreach (var propInfo in elementType.GetProperties())
            {
                row[propInfo.Name] = propInfo.GetValue(item, null) ?? DBNull.Value;
            }
        }
        t.Rows.Add(row);
    }

    return ds;
}
 1
Author: Richard Edwards,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-26 19:52:14

Jedną z opcji byłoby użycie systemu.ComponenetModel.BindingList zamiast listy.

To pozwala używać go bezpośrednio w DataGridView. I w przeciwieństwie do normalnego systemu.Kolekcje.Ogólne.Lista aktualizuje Widok DataGridView w przypadku zmian.

 0
Author: JDunkerley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-07 16:20:06

Znalazłem ten kod na forum Microsoftu. Jest to do tej pory jeden z najprostszych sposobów, łatwy do zrozumienia i użycia. To zaoszczędziło mi godziny, dostosowałem go jako metodę rozszerzenia bez żadnych zmian do rzeczywistej metody. Poniżej znajduje się kod. to nie wymaga wiele wyjaśnień.

Można używać dwóch podpisów funkcji z tą samą implementacją

1) public static DataSet ToDataSetFromObject (this object dsCollection)

2) public static DataSet ToDataSetFromArrayOfObject (this obiekt [] arrCollection). Użyję tego na przykład.

// <summary>
// Serialize Object to XML and then read it into a DataSet:
// </summary>
// <param name="arrCollection">Array of object</param>
// <returns>dataset</returns>

public static DataSet ToDataSetFromArrayOfObject( this object[] arrCollection)
{
    DataSet ds = new DataSet();
    try {
        XmlSerializer serializer = new XmlSerializer(arrCollection.GetType);
        System.IO.StringWriter sw = new System.IO.StringWriter();
        serializer.Serialize(sw, dsCollection);
        System.IO.StringReader reader = new System.IO.StringReader(sw.ToString());
        ds.ReadXml(reader);
    } catch (Exception ex) {
        throw (new Exception("Error While Converting Array of Object to Dataset."));
    }
    return ds;
}

Aby użyć tego rozszerzenia w kodzie

Country[] objArrayCountry = null;
objArrayCountry = ....;// populate your array
if ((objArrayCountry != null)) {
    dataset = objArrayCountry.ToDataSetFromArrayOfObject();
}
 0
Author: kumar chandraketu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-01 16:02:25