Benutzer mit den meisten Antworten
Wie speichere ich ListBox.Items <=> eine DataTable,Spalte ?

Frage
Antworten
-
Hallo Herr K-Pater,
richtig erkannt
genau so ähnlich mein Ziel ist "ListBox.Items => Serialisieren => B64 => dt.String"
ich bitte um ein Beispielcode zum ListBox.Items <=> dt.String
Andere Frage auf einen Schlag zuweisen geht (ohne Schleife) ?
MFG
Hallo ati.sah,
ok, hier ein Vorschlag (ganz ohne Schleifen :-). Zunächst ein paar kleine Helfer:
public static byte[] ExportBytes<T>(ref T obj) { using ( MemoryStream ms = new MemoryStream() ) { BinaryFormatter bf = new BinaryFormatter(); try { bf.Serialize(ms, (T)obj); return ms.ToArray(); } catch (Exception) { return null; } } } public static bool ImportBytes<T>(byte[] bytes, out T data) { try { using ( MemoryStream ms = new MemoryStream(bytes) ) { BinaryFormatter bf = new BinaryFormatter(); data = (T)bf.Deserialize(ms); return true; } } catch ( Exception ) { data = default(T); return false; } }
public String ListboxItemsToString(ListBox lb) {
return Convert.ToBase64String(ExportBytes<List<string>>(lb.Items.Cast<String>().ToList()));
}
public bool StringToListBoxItems(string data, ref ListBox lb ) {
List<string> back;
bool ok = ImportBytes<List<string>>(Convert.FromBase64String(data), out back);
lb.Items.Clear();
lb.Items.AddRange(back.ToArray<object>());
return ok;
}Die folgende Methode zeigt die Anwendung:
Grußprivate void FillListBoxItems() { listBox1.Items.Clear(); listBox1.Items.Add("Auswahl 1"); listBox1.Items.Add("Auswahl 2"); listBox1.Items.Add("Auswahl 3");
// sichern...
string lbString = ListboxItemsToString(listBox1);
// und zurück
bool ok = StringToListBoxItems(lbString, ref listBox1);
}
-
Hallo,
ja, er meckert zurecht. Ändere die Signatur
public static byte[] ExportBytes<T>(ref T obj)
zu
public static byte[] ExportBytes<T>(T obj)
oder ändere die Methode ListboxItemsToString wie folgt:
public String ListboxItemsToString(ListBox lb) { var items = lb.Items.Cast<String>().ToList(); return Convert.ToBase64String(ExportBytes<List<string>>(ref items)); }
dann sollte es hoffentlich gehen...
Gruß
- Als Antwort markiert ati.sah Dienstag, 15. März 2016 17:31
Alle Antworten
-
Hallo ati.sah,
die Datatable hat zunächst einmal mehrere Zeilen(Rows). Jede dieser Zeilen hat dann eine Anzahl von Spalten (Columns) die in jeder Zeile gleich sind.
Für ein Codebeispiel ist es noch wichtig zu wissen, welche Art von Datatable Du verwendest.
Du kannst über den VisualStudio Designer typisierte Datsets erstellen, diese beinhalten dann auch typisierte Datatables.
Ein Listbox würde ich dann über Datenbindung an die Datatable binden, und nicht einzeln, oder über eine Schleife zuweisen.
Beispiel für eine Datenbindung:
lb.DataSource = dt; lb.DisplayMember = "Spalte2"; lb.ValueMember = "Id";
Bei dem Beispiel wird die Datatable dt an die Listbox lb gebunden.
Angezeigt wird der Inhalt der Spalte "Spalte2".
Beim Auswählen eines Elementes der Listbox wird der Inhalt der Spalte "Id" in SelectedValue geschrieben.
SelectedValue beinhaltet also den Wert den Du weiterverwenden kannst.
SelectedItem beinhaltet die komplette DataRow die Du ausgewählt hast,
und SelectedIndex beinhaltet den Index der Listbox-Auswahl.
Grüße
Roland
- Bearbeitet Roland Franz Freitag, 11. März 2016 21:04
-
Hallo.
mir geht's darum den gesamten lb.Items[] eines ListBoxes in eine Datensatzspalte z.B. dt[1]["sTxt"]; zu speichern.
Den Spaltentyp habe ich als String definiert, wo es nicht klappt ?
dt[1]["sTxt"] = lb.Items; ?
MFG
- Bearbeitet ati.sah Samstag, 12. März 2016 06:08
-
Hallo,
wie gesagt, müsste ich noch wissen ob die verwendete Datatable typisiert ist.
Dann würde ich bei einer Datatable erwarten, dass diese per Data- oder Tableadapter aus einer Datnbanktabelle befüllt wird.
Ansonsten hier noch einmal ein Beispiel wie Du mal per Schleife Werte in eine Datatable aufnehmen kannst, damit Du erst mal etwas zum Testen hast.
for(int i = 0; i < 10; i++) { dtTest.AdddtTestRow("Beispieltext" + i.ToString()); }
Bei Dir wird der Name der Datatable "dtTest" und die Methode "AddTestRow natürlich anders heißen, falls DU eine Typsierte Datatable hast.
Der Name kommt aus dem Dataset Designer siehe hier:
Grüße
Roland
- Bearbeitet Roland Franz Samstag, 12. März 2016 07:39
-
Hallo.
mir geht's darum den gesamten lb.Items[] eines ListBoxes in eine Datensatzspalte z.B. dt[1]["sTxt"]; zu speichern.
Den Spaltentyp habe ich als String definiert, wo es nicht klappt ?
dt[1]["sTxt"] = lb.Items; ?
MFG
Eine Listbox verwendet man so, dass man die Einträge der Listbox aus einer Stammtabelle füllt, um dann den/die ausgewählten Eintrag(e) (SelectedItem(s)) in eine andere Tabelle zu speichern.
Oder Du verwendest die Listbox nur um eine List von Einträgen darzustellen
Was hast Du genau vor?
Grüße
Roland
- Bearbeitet Roland Franz Samstag, 12. März 2016 07:34
-
Hallo,
vielen dank.
ich habe vor in eine DataTable mit einer SpaltenType String alle Einträge eines ListBoxes.Items[] zu einem Datensatz füllen und beim Selektieren eines Datensatzes wieder diese aus dem Datensatz in ein ListBox zurückzugeben (Löschen, Änder, Neueinfügen).
Eine Schleife habe ich gefunden im Internet, was nicht alle Einträge eines ListBoxes auf einmal zuweisen kann.
Ich weiß nicht was für ein DataTable Type in diesem Fall paßt (typesiert) ?
MFG
-
Am besten fängst Du mal mit einer typisierten Datatable an, die kannst Du im Datasetdesigner erstellen, das ist zunächst mal einfacher.
Wenn Du das gemacht hast, zeige uns hier wie die DataTable aussieht, und ich erstelle Dir dann mal ein kleines Beispiel, wie Du per Auswahl in der ersten Listbox die ausgewählten Einträge in einer zweiten Listbox anzeigst.
Aber jetzt musst Du erst mal die Datatable liefern ;-)
Grüße
Roland
-
Hallo.
mir geht's darum den gesamten lb.Items[] eines ListBoxes in eine Datensatzspalte z.B. dt[1]["sTxt"]; zu speichern.
Den Spaltentyp habe ich als String definiert, wo es nicht klappt ?
dt[1]["sTxt"] = lb.Items; ?
MFG
Hallo,
der Listbox.Items Typ ist eine "ObjectCollection", also nicht einfach nur ein String, den man in eine Variable/Feld speichern kann.
Wenn du, wie in der Ausgangslage definiert, die "Items" (=ObjectCollection:IList,ICollection,IEnumerable) in einen "String" verpacken willst, könntest du die Items z.B. in ihrer Gesamtheit erst einmal irgendwie serialisieren und z.B. als Base64-String dann unter einer String-Typ-Variablen ablegen. Und später umgekehrt.Das wäre grob dieses Szenario:
Ist es das, was du machen willst? Oder kannst du mal etwas umfangreicher darstellen, was das Ziel deiner Konstruktion ist? Ist die DataTable als Speicherobjekt fest vorgegeben? Sollen mehrere verschiedene Listboxen zusammengefasst werden?...
Gruß
Nachtrag: Falls du aber jedes Item der Items-Collection in jeweils eine Zeile der Datatable ablegen willst und wieder zurück, kannst du das so machen:
private DataTable dt; private void ListBoxToDataTable() { dt = new DataTable(); dt.Columns.Add("ListBoxItem", typeof(string)); foreach (object item in listBox1.Items) { dt.Rows.Add(new string[] { item.ToString() }); } } private void DataTableToListBox() { listBox1.Items.Clear(); foreach (DataRow row in dt.Rows) { listBox1.Items.Add(row["ListBoxItem"]); } }
Gruß
- Bearbeitet K. Pater Samstag, 12. März 2016 11:37
-
Hi,
nachfolgend eine kurze Demo als Anregung (ohne typisierte DataSet, einfach nur mit den Basisklassen). Kopiere den Code in eine leere Windows Forms Anwendung:using System; using System.Data; using System.Windows.Forms; namespace WindowsFormsApplication1CS { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private SplitContainer sc = new SplitContainer() { Orientation = Orientation.Horizontal, Dock = DockStyle.Fill }; private Button btn1 = new Button() { Text = "Übertragen", Dock = DockStyle.Top }; private ListBox lb1 = new ListBox() { Dock = DockStyle.Fill, DisplayMember = "Spalte1", SelectionMode = SelectionMode.MultiExtended }; private ListBox lb2 = new ListBox() { Dock = DockStyle.Fill, DisplayMember = "Ausgewählt" }; private void Form09_Load(object sender, EventArgs e) { this.Controls.AddRange(new Control[] { btn1, sc }); sc.Panel1.Controls.Add(lb1); sc.Panel2.Controls.Add(lb2); lb1.DataSource = GetData(); btn1.Click += Btn1_Click; } private void Btn1_Click(object sender, EventArgs e) { DataTable dt = new DataTable(); dt.Columns.Add("Ausgewählt", typeof(string)); foreach (var item in lb1.SelectedItems) dt.Rows.Add(((DataRowView)item).Row.ItemArray[0]); lb2.DataSource = dt; } private DataTable GetData() { DataTable dt = new DataTable(); dt.Columns.Add("Spalte1", typeof(string)); for (int i = 1; i < 100; i++) dt.Rows.Add($"Zeile {i}"); return dt; } } }
--
Viele Grüsse
Peter Fleischer (MVP, Partner)
Meine Homepage mit Tipps und Tricks
Kommas richtig setzen!
Schüler sagen, Lehrer haben es gut.
Schüler, sagen Lehrer, haben es gut -
Hallo Herr K-Pater,
richtig erkannt
genau so ähnlich mein Ziel ist "ListBox.Items => Serialisieren => B64 => dt.String"
ich bitte um ein Beispielcode zum ListBox.Items <=> dt.String
Andere Frage auf einen Schlag zuweisen geht (ohne Schleife) ?
MFG
- Bearbeitet ati.sah Sonntag, 13. März 2016 09:56
-
Hallo Herr K-Pater,
richtig erkannt
genau so ähnlich mein Ziel ist "ListBox.Items => Serialisieren => B64 => dt.String"
ich bitte um ein Beispielcode zum ListBox.Items <=> dt.String
Andere Frage auf einen Schlag zuweisen geht (ohne Schleife) ?
MFG
Hallo ati.sah,
ok, hier ein Vorschlag (ganz ohne Schleifen :-). Zunächst ein paar kleine Helfer:
public static byte[] ExportBytes<T>(ref T obj) { using ( MemoryStream ms = new MemoryStream() ) { BinaryFormatter bf = new BinaryFormatter(); try { bf.Serialize(ms, (T)obj); return ms.ToArray(); } catch (Exception) { return null; } } } public static bool ImportBytes<T>(byte[] bytes, out T data) { try { using ( MemoryStream ms = new MemoryStream(bytes) ) { BinaryFormatter bf = new BinaryFormatter(); data = (T)bf.Deserialize(ms); return true; } } catch ( Exception ) { data = default(T); return false; } }
public String ListboxItemsToString(ListBox lb) {
return Convert.ToBase64String(ExportBytes<List<string>>(lb.Items.Cast<String>().ToList()));
}
public bool StringToListBoxItems(string data, ref ListBox lb ) {
List<string> back;
bool ok = ImportBytes<List<string>>(Convert.FromBase64String(data), out back);
lb.Items.Clear();
lb.Items.AddRange(back.ToArray<object>());
return ok;
}Die folgende Methode zeigt die Anwendung:
Grußprivate void FillListBoxItems() { listBox1.Items.Clear(); listBox1.Items.Add("Auswahl 1"); listBox1.Items.Add("Auswahl 2"); listBox1.Items.Add("Auswahl 3");
// sichern...
string lbString = ListboxItemsToString(listBox1);
// und zurück
bool ok = StringToListBoxItems(lbString, ref listBox1);
}
-
Hallo,
er meckert bei der Fkt:
public String ListboxItemsToString(ListBox lb) { return Convert.ToBase64String(ExportBytes<List<string>>(lb.Items.Cast<String>().ToList())); }
"Fehler 119 Das 1-Argument muss mit dem ref-Schlüsselwort übergeben werden." ?
MFG
- Bearbeitet ati.sah Dienstag, 15. März 2016 08:53
-
Hallo,
ja, er meckert zurecht. Ändere die Signatur
public static byte[] ExportBytes<T>(ref T obj)
zu
public static byte[] ExportBytes<T>(T obj)
oder ändere die Methode ListboxItemsToString wie folgt:
public String ListboxItemsToString(ListBox lb) { var items = lb.Items.Cast<String>().ToList(); return Convert.ToBase64String(ExportBytes<List<string>>(ref items)); }
dann sollte es hoffentlich gehen...
Gruß
- Als Antwort markiert ati.sah Dienstag, 15. März 2016 17:31