Autor |
Beitrag |
Cäptin Pommes
      
Beiträge: 142
Erhaltene Danke: 2
|
Verfasst: Do 12.05.11 09:09
hallo,
ich speichere eine List<> per BinaryFormatter und lade sie auch wieder, er wirft keine exception aber es klappt nicht ...
hier erstmal der Code
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| public static void SaveDataContent() { FileStream fs = new FileStream(Login.userPath + "/data.pswc", FileMode.Open); BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(fs, Data.pswList); }
public static void LoadDataContent() { try { FileStream fs = new FileStream(Login.userPath + "/data.pswc", FileMode.Open); BinaryFormatter bf = new BinaryFormatter(); Data.pswList = (List<Data>)bf.Deserialize(fs); } catch (SerializationException) { } } |
und nachdem sie geladen wurde führe ich die funktion aus
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| private void fillDataGrid() { dt.Clear();
for (int i = 0; i < Data.pswList.Count; i++) { if (Data.pswList[i].Tn.Equals(treeView1.SelectedNode)) { DataRow dr = dt.NewRow(); dr[0] = Data.pswList[i].Title; dr[1] = Data.pswList[i].Username; dr[2] = Data.pswList[i].Psw; dr[3] = Data.pswList[i].Url; dr[4] = Data.pswList[i].Comments;
dt.Rows.Add(dr); } }
dataGridView1.DataSource = dt; } |
soo jetzt wird aber in meinem dataGridView nix angezeigt
Die funktion benutzt ich aber schon erfolgreich wenn man per hand was dem DataGridView hinzufügt
Es klappt nur nicht nach ich es aus der Datei Lade
kann mir einer sagen warum das so ist?
danke im vorraus
Moderiert von Christian S.: Code- durch C#-Tags ersetzt
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Do 12.05.11 10:04
Zitat: | er wirft keine exception aber es klappt nicht |
C#-Quelltext 1: 2:
| catch (SerializationException) { } |
Sicher das er das nicht tut? Oder hast du den Code nicht eher so geschrieben das du nichts merkst wenn den eine beim Serialisieren auftritt?
Nebenbei warum kopierst du dir das in eine Datatable? Deine List<Data> ist genauso an das GridView bindbar.
|
|
Cäptin Pommes 
      
Beiträge: 142
Erhaltene Danke: 2
|
Verfasst: Do 12.05.11 10:15
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Do 12.05.11 10:30
Zeig mal die Data Klasse und die Klasse die sich hinter der Variablen Data versteckt oder ist pswList etwa statisch?
Sicherheitshalber solltest du den FileStream in beiden Methoden auch explizit schließen. Am besten verwendest du einen using Block dafür.
|
|
Cäptin Pommes 
      
Beiträge: 142
Erhaltene Danke: 2
|
Verfasst: Do 12.05.11 10:35
Also ich hab das grad ausprobiert die List<Data> direkt dem GridView zuzuweisen und es klappt! Nun klappt es auch mit dem Laden aus der Datei ... muss also irgentwie mit der DataTable zutun gehabt haben.
Aber eine frage hab ich da noch ... Wenn ich dem GridView die List zuweise dann benutzt er als Spalten Namen die Varibalen Namen von den Data objekten die sich in der List befinden, ich will aber das sich die Daten in den schon vorhanden Spalten einordnen und keine neuen erzeugen und es sollen auch nich alle daten angezeigt werden
muss ich das dann anders machen als dataGridView1.DataSource = Data.pswList; ?
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Do 12.05.11 12:09
Wenn du vorgefertigte Spalten im Grid hast und keine neuen erzeugt werden sollen musst du die AutoGenerateColumns Property auf false setzen.
Wennn du nicht alle Zeilen der Liste anzeigen willst musst du die halt filtern.
Via Linq z.B. so
C#-Quelltext 1:
| dataGridView1.DataSource = Data.pswList.Where(x => x.Tn.Equals(treeView1.SelectedNode)); |
|
|
Cäptin Pommes 
      
Beiträge: 142
Erhaltene Danke: 2
|
Verfasst: Do 12.05.11 13:15
hmmm ok jetzt fügt er die spalten nich hinzu, trägt aber die daten auch nich in die anderen ein wo sie eigentlich rein sollen :/
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Do 12.05.11 14:17
Dein Columns im GridView haben eine DataPropertyName da sollte der Name der Property drinstehen an die gebunden wird. Wenn du noch keine großartigen Einstellungen an den Columns vorgenommen hast würde ich dir empfehlen die weg zuwerfen und das Grid einmal richtig auf bauen so wie man das üblicherweise machen würde. Dann fühlt sich das ganze auch nicht so hakelig an wie wahrscheinlich jetzt gerade für dich
Ablauf.
1. BindingSource auf die Form werfen
2. In der DataSource Property der BindingSource den 'Add Project Data Source'-Menüpunkt aufrufen
3. Im Dialog 'Objekt' anklicken und im folgenden dann deine Data Klasse in der angezeigten Liste auswählen.
4. Im informs Editor die BindingSource an das DataGridView binden
5. Jetzt sollte die Struktur deiner Daten im GridView zu sehen und du kannst die das Grid nach deinen wünschen einstellen
6. Zur Laufzeit sobald du eine konkrete List<Data> Instanz hast diese an die BindingSource binden. Fertig.
Für diesen Beitrag haben gedankt: Cäptin Pommes
|
|
Cäptin Pommes 
      
Beiträge: 142
Erhaltene Danke: 2
|
Verfasst: Do 12.05.11 17:52
super! Das is so ja viel einfacher
vielen dank für die kleine anleitung!
jetzt klappt alles soweit!
aber 2 kleine fragen hab ich noch  ^^
und zwar hab ich eine eine spalte als DataGridViewLinkColumn deklariert weil dort url´s angezeigt werden. Wie mach ich jetzt das sich der Browser öffnet und der Link auch aufgerufen wird? im moment passiert nähmlich nix =/ ist bestimmt wieder total simpel ^^
und eine spalte soll für passwörter sein, kann man da wie bei einer textbox einen PasswordChar setzten?
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Do 12.05.11 19:23
Zitat: | und zwar hab ich eine eine spalte als DataGridViewLinkColumn deklariert weil dort url´s angezeigt werden. Wie mach ich jetzt das sich der Browser öffnet und der Link auch aufgerufen wird? im moment passiert nähmlich nix =/ ist bestimmt wieder total simpel ^^ |
Möglicherweise gibts dafür eine fertige Funktion im Grid bzw. den GridColumns. Du kannst aber auch einfach den CellClickoder CellDoubleClick Event des Grids fangen, auswerten ob du deine Column mit dem Link getroffen hast und dann auf der Shell ausführen um den Standardbrowser zu öffnen.
Also irgendwie so
C#-Quelltext 1: 2: 3: 4: 5:
| private void meinLiebesDataGrid_CellDoubleClick(object sender, DataGridViewCellEventArgs e) { if (e.ColumnIndex == derIndexMeinerLinkColumn) Process.Start((MeineLiebeBindingSource.Current as Data).Url); } |
Zitat: | und eine spalte soll für passwörter sein, kann man da wie bei einer textbox einen PasswordChar setzten? |
CellFormatting Event fangen und den anzuzeigenden Text auf Passwordchar ändern. Und zusätzlich das EditingControlShowing fangen darin das Editing Control auf TextBox casten und eben wie bei normalen Textboxen einfach die UseSystemPasswordChar Property setzen.
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| private void meinLiebesDataGrid_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { if ((e.ColumnIndex == derIndexMeinerLinkColumn) && (e.Value != null)) { var box = new TextBox(); box.UseSystemPasswordChar = true; e.Value = new String(box.PasswordChar, e.Value.ToString().Length); } }
private void meinLiebesDataGrid_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) { if (meinLiebesDataGrid.CurrentCell.ColumnIndex == derIndexMeinerLinkColumn) { var box = e.Control as TextBox; if (box != null) box.UseSystemPasswordChar = true; } } |
Für diesen Beitrag haben gedankt: Cäptin Pommes
|
|
Cäptin Pommes 
      
Beiträge: 142
Erhaltene Danke: 2
|
Verfasst: Fr 13.05.11 12:45
Klasse! Danke, es klappt ohne probleme!
Vielen Dank für die Hilfe!
|
|