ComboBox DisplayMember-Problem

26/01/2010 - 16:10 von Friedrich Kölbel | Report spam
Hallo Leute,

Ich habe ein Problem mit der DisplayMember-Funktion der Combobox an
dem ich mir schon alle Zàhne ausgebissen hab...

In meinem Projekt hab ich mehrere solcher Boxen die àhnlich oder
gleich funktionieren und (nur) eine deren DisplayMember-Funktion ich
einfach nicht gebacken bekomme - statt des gewünschten Wertes kommt
immer der String "Ontime.ClientWF.OntimeData+UsageGroupRow" in allen
Zeilen - das ist der Typ des gebundenen Inhalts.
Ich hatte bereits dieses Verhalten beobachtet, wenn ich eine
fehlehafte oder nicht existente Funktion als DisplayMember übergeben
habe - aber in diesem Fall hab ich alles 50mal gecheckt - siehe
kommentare im Code...


private OnTimeData.UsageGroup UsageGroups = null;

private void selectUsage_Load(object sender, EventArgs e)
{
try
{
UsageGroups = new OnTimeData.UsageGroup();

List<OnTimeData.UsageGroupRow> gruppen = new
List<OnTimeData.UsageGroupRow>();
foreach (OnTimeData.UsageGroupRow usageGroup in
UsageGroups.getRowsForMainGroup(selectedUser.usage_group_id))
{
gruppen.Add(usageGroup);
}
OnTimeData.UsageGroupRow alleRow = new OnTimeData.UsageGroupRow();
alleRow.group_u_id = -1;
alleRow.group_u_name = "(alle)";
gruppen.Insert(0, alleRow);

//an dieser Stelle hat "gruppen" 6 Elemente. Alle Elemente haben ein
Feld "Fullname" mit einem Wert (dieser entspricht group_u_name)

this.usageGroupFilter.ValueMember = "group_u_id";
this.usageGroupFilter.DisplayMember = "Fullname";
this.usageGroupFilter.DataSource = gruppen;

//nun werden zwar genau 6 Elemente in der ComboBox aufgelistet und
nach der Auswahl eines Elementes kann auch ganz normal das Objekt
inkl. Fullname abgerufen werden (siehe unten OnFilterChanged() )

// in der Auflistung steht aber leider in jeder Zeile statt "(alle)"
und "Gruppe1" "Gruppe2" usw. imme folgender String:
// Ontime.ClientWF.OntimeData+UsageGroupRow

}
...
}

private void OnFilterChanged()
{
MessageBox.Show((this.usageGroupFilter.SelectedItem as
OnTimeData.UsageGroupRow).Fullname);

//an dieser Stelle wird genau der gewünschte String ausgegeben,
also z.B. "(alle)"

//...hier passiert noch einiges und das funktioniert auch ganz
gut...
}

Hat jemand eine Idee wie ich nach der Festlegung des "DisplayMember"
noch etwas tiefer in das Problem reindebuggen könnte (der Debugger
überspringt ja diese Zeile dann einfach) - denn derzeit kommen ja
keine Fehler, keine Warnings, es wird einfach nich das richtige
angezeigt...

Oder hat jemand sogar eine Idee, was der Fehler sein könnte?

Danke im Voraus für Eure Antworten,
LG Fritz Kölbel
 

Lesen sie die antworten

#1 Friedrich Kölbel
26/01/2010 - 17:14 | Warnen spam
On 26 Jan., 16:10, Friedrich Kölbel wrote:
Hallo Leute,

Ich habe ein Problem mit der DisplayMember-Funktion der Combobox an
dem ich mir schon alle Zàhne ausgebissen hab...

In meinem Projekt hab ich mehrere solcher Boxen die àhnlich oder
gleich funktionieren und (nur) eine deren DisplayMember-Funktion ich
einfach nicht gebacken bekomme - statt des gewünschten Wertes kommt
immer der String "Ontime.ClientWF.OntimeData+UsageGroupRow" in allen
Zeilen - das ist der Typ des gebundenen Inhalts.
Ich hatte bereits dieses Verhalten beobachtet, wenn ich eine
fehlehafte oder nicht existente Funktion als DisplayMember übergeben
habe - aber in diesem Fall hab ich alles 50mal gecheckt - siehe
kommentare im Code...

private OnTimeData.UsageGroup UsageGroups = null;

private void selectUsage_Load(object sender, EventArgs e)
{
  try
  {
    UsageGroups = new OnTimeData.UsageGroup();

    List<OnTimeData.UsageGroupRow> gruppen = new
List<OnTimeData.UsageGroupRow>();
    foreach (OnTimeData.UsageGroupRow usageGroup in
UsageGroups.getRowsForMainGroup(selectedUser.usage_group_id))
    {
        gruppen.Add(usageGroup);
    }
    OnTimeData.UsageGroupRow alleRow = new OnTimeData.UsageGroupRow();
    alleRow.group_u_id = -1;
    alleRow.group_u_name = "(alle)";
    gruppen.Insert(0, alleRow);

//an dieser Stelle hat "gruppen" 6 Elemente. Alle Elemente haben ein
Feld "Fullname" mit einem Wert (dieser entspricht group_u_name)

    this.usageGroupFilter.ValueMember = "group_u_id";
    this.usageGroupFilter.DisplayMember = "Fullname";
    this.usageGroupFilter.DataSource = gruppen;

//nun werden zwar genau 6 Elemente in der ComboBox aufgelistet und
nach der Auswahl eines Elementes kann auch ganz normal das Objekt
inkl. Fullname abgerufen werden (siehe unten OnFilterChanged() )

// in der Auflistung steht aber leider in jeder Zeile statt "(alle)"
und "Gruppe1" "Gruppe2" usw. imme folgender String:
//              Ontime.ClientWF.OntimeData+UsageGroupRow

        }
...

}

private void OnFilterChanged()
{
    MessageBox.Show((this.usageGroupFilter.SelectedItem as
OnTimeData.UsageGroupRow).Fullname);

    //an dieser Stelle wird genau der gewünschte String ausgegeben,
also z.B. "(alle)"

    //...hier passiert noch einiges und das funktioniert auch ganz
gut...

}

Hat jemand eine Idee wie ich nach der Festlegung des "DisplayMember"
noch etwas tiefer in das Problem reindebuggen könnte (der Debugger
überspringt ja diese Zeile dann einfach) - denn derzeit kommen ja
keine Fehler, keine Warnings, es wird einfach nich das richtige
angezeigt...

Oder hat jemand sogar eine Idee, was der Fehler sein könnte?

Danke im Voraus für Eure Antworten,
 LG Fritz Kölbel



Lösung gefunden, bitte nicht mehr den Kopf zerbrechen.

Nachdem ich diese Frage geschrieben hab und mich nun endlich wieder
anderen Problemen im Programm zugewendet hab, hat sich die Lösung sehr
Zufàllig ergeben - ich werd wohl nicht mehr rausfinden WARUM.

Jedenfalls hier der geànderte Code:

private void OnFilterChanged()
{
try
{
bool selectAll = this.usageGroupFilter.SelectedItem != null &&
(this.usageGroupFilter.SelectedItem as
OnTimeData.UsageGroupRow).group_u_id == -1;

code

}
catch (Exception)
{}
}

beim ersten Aufruf des Fensters fàhrt das Programm immer in das catch
() übrigens noch bevor selectUsage_Load aufgerufen wird (obwohl es
ohne das try an dieser Stelle kein Problem gab) - durch diese Änderung
kommen nun aber die richtigen Display-Werte in this.usageGroupFilter
Der Fehler der das Catch auslöst ist übrigens eine Variable die in
"...code" benutzt wird obwohl sie zu diesem Zeitpunkt noch nicht
befüllt ist - hat aber nix mit gruppe zu tun...

Bei den anderen (funktionierenden) ComboBoxen hatte ich das selbe
Konstrukt (und den selben Fehler) - dort ist es ziemlich egal ob nun
mit oder ohne try catch...

muss man das versehen?

Ähnliche fragen