DataGridView.DataSource und Löschen von Zeilen

22/11/2008 - 16:06 von Michaela Meier | Report spam
Hi,

Ich habe eine List<MeineKlasse>, die ich als DataSource an ein (nicht
editierbares) DataGridView hànge.
Per Code entferne ich einige Zeilen mit z.B. MeineListe.RemoveAll
(...), was sich nach einem anschließenden dgv.Refresh auch bemerkbar
macht.

Leider macht sich beim arglosen Scrollen ans Ende der Liste auch ein
nerviger Fehler bemerkbar.
Und zwar ein IndexOutOfRangeException, weil die -nach dem Remove
überflüssigen- Zeilen im Grid nicht automatisch entfernt wurden
sondern einfach leer geblieben sind.

Wie stelle ich denn diesen Unfug ab?
Die Zeilenzahl nach dem Löschen manuell zu setzen, wird vom GridView
leider auf entschiedenste abgelehnt.
 

Lesen sie die antworten

#1 Frank Dzaebel
22/11/2008 - 17:48 | Warnen spam
Hallo Michaela,

Ich habe eine List<MeineKlasse>, die ich als DataSource an ein (nicht
editierbares) DataGridView hànge.
Per Code entferne ich einige Zeilen mit z.B. MeineListe.RemoveAll
(...), was sich nach einem anschließenden dgv.Refresh auch bemerkbar
macht.



Du kannst das zum Beispiel korrigieren, indem Du
den DataSource über BindingSource bindest.
Hier nochmal das angepasste Beispiel, wo Du kein
Feedback gegeben hattest:

List<Person> personen = new List<Person>();
BindingSource bs;

private void Form1_Load(object sender, EventArgs e)
{
personen.Add(new Person("Gustav", new DateTime(1001, 1, 1)));
personen.Add(new Person("Donald", new DateTime(1002, 2, 2)));
personen.Add(new Person("Tick", new DateTime(1003, 3, 3)));
personen.Add(new Person("Trick", new DateTime(1004, 4, 4)));
personen.Add(new Person("Donald", new DateTime(1002, 2, 2)));
personen = new List<Person>().Union(personen).ToList();
bs = new BindingSource(personen, null);
dataGridView1.DataSource = bs;
dataGridView1.ReadOnly = true;
}

class Person
{
public Person(string vorname, DateTime geburt)
{
this.Vorname = vorname; this.Geburtsdatum = geburt;
}
public string Vorname { get; set; }
public DateTime Geburtsdatum { get; set; }
public override string ToString()
{
StringBuilder sb = new StringBuilder();
foreach (PropertyDescriptor pd in
TypeDescriptor.GetProperties(typeof(Person)))
{
string val = pd.GetValue(this).ToString();
sb.AppendFormat("{0},", val);
}
return sb.ToString();
}
public override int GetHashCode()
{
return (this.ToString().GetHashCode());
}
public override bool Equals(object obj)
{
return this.ToString().Equals(obj.ToString());
}
}

private void btnLöschen_Click(object sender, EventArgs e)
{ //alle Zeilen löschen ..
this.Validate(); bs.EndEdit(); bs.Clear();
// bs.RemoveCurrent(); // nur die aktuelle
}


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen