Autor Beitrag
Christoph1972
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 690
Erhaltene Danke: 16


VS2015 Pro / C# & VB.Net
BeitragVerfasst: Di 17.03.09 10:47 
Hallo Leute,


ich möchte alle Values einer ListBox in eine List<String> kopieren. Ist das auch als Einzeiler möglich?



Gruß
Christoph


Moderiert von user profile iconKha: Topic aus Basistechnologien verschoben am Di 17.03.2009 um 14:11
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 17.03.09 10:55 
Wenn du die List<String> schon an die ListBox gebunden hast (DataSource Property) ist es ein 0-Zeiler.
Die Frage ist was hast du für Objekte an die ListBox gebunden?
Christoph1972 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 690
Erhaltene Danke: 16


VS2015 Pro / C# & VB.Net
BeitragVerfasst: Di 17.03.09 11:32 
Das DataSource der LB ist an ein DataTable gebunden. Ich möchte den Text der Items in eine List<String> kopieren. Die Liste wird an einen anderen Programmteil weitergegeben.



Gruß
Christoph
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Di 17.03.09 13:21 
Hallo Christoph,

dann geht es nicht als Einzeiler: Elemente der ListBox sind die Zeilen der DataTable, diese könnten direkt übergeben werden. Per DisplayMember holst Du aber aus jeder Zeile genau einen Wert. Es gibt keine direkte Maßnahme, alle Werte dieser Spalte direkt in eine List<string> zu übernehmen. Du musst es durch eine Schleife machen.

(Vor wenigen Monaten gab es eine längere Diskussion darüber, wie das am besten und schnellsten erledigt werden kann - ich glaube, das war hier im c-sharp-forum. Mit der Suche nach "spalte, array" habe ich aber noch nichts Passendes gefunden.)

Gruß Jürgen
Christoph1972 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 690
Erhaltene Danke: 16


VS2015 Pro / C# & VB.Net
BeitragVerfasst: Di 17.03.09 13:32 
OK, vielen Dank euch!!! Hätte ja sein können, das möglich ist.

Gruß
Christoph
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 17.03.09 18:10 
Direkt geht kein Einzeiler(außer es gibt in Linq noch irgendwo eine schicke Cast<> Methode die ich nicht kenne).
Damit es im relevanten Code wie ein Einzeiler aussieht könnte man eine Extension Method schreiben. Ich würde das aber nicht an die ListBox sondern direkt an der Datenquelle hängen. In deinem Fall würde ich eine Extension Method für die DataRowCollection der DataTable schreiben.
Dann kann man am Ende soetwas schreiben wie

List<string> meineListe = meineDataTable.Rows.AsList<string>(MeineDataColumnDessenSpaltenwerteIchMoechte);



ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
    static class Program
    {
        static void Main()
        {
            DataTable dt = new DataTable();
            DataColumn dcA = dt.Columns.Add("A"typeof(string));
            DataColumn dcB = dt.Columns.Add("B"typeof(string));
            DataColumn dcC = dt.Columns.Add("C"typeof(string));

            dt.Rows.Add(new Object[] { "a1""b1""c1" });
            dt.Rows.Add(new Object[] { "a2""b2""c2" });
            dt.Rows.Add(new Object[] { "a3""b3""c3" });

            List<string> list = dt.Rows.AsList<string>(dcA);
        }
    }

    public static class ExtensionMethod
    {
        public static List<T> AsList<T>(this DataRowCollection rows, DataColumn column)
        {
            List<T> list = new List<T>();

            foreach (DataRow row in rows)
            {
                T value = (T)Convert.ChangeType(row[column], typeof(T), CultureInfo.CurrentCulture);
                list.Add(value);
            }

            return list;
        }
    }
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Di 17.03.09 19:28 
user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
außer es gibt in Linq noch irgendwo eine schicke Cast<> Methode die ich nicht kenne
Ihren Namen scheinst du aber schon zu kennen :zwinker: ?
ausblenden C#-Quelltext
1:
table.Rows.Cast<DataRow>().Select(row => (string)row[column]).ToList()					

_________________
>λ=
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 17.03.09 19:44 
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
außer es gibt in Linq noch irgendwo eine schicke Cast<> Methode die ich nicht kenne
Ihren Namen scheinst du aber schon zu kennen :zwinker: ?
ausblenden C#-Quelltext
1:
table.Rows.Cast<DataRow>().Select(row => (string)row[column]).ToList()					

Kennen ja. Vermuten das das damit irgendwie gehen muß auch. Mir fehlt nur noch das Gefühl wie und wann Linq/Lambdas einzusetzen sind.
Aber ich habe darauf spekuliert das sich da jemand auskennt und auf das Stichwort anspringt. Hat bei dir ja funktioniert :zwinker: