vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
sevDataGrid - Gönnen Sie Ihrem SQL-Kommando diesen krönenden Abschluß!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

C# Ecke
ObjectWrapper kopieren 
Autor: IdC#
Datum: 07.05.12 13:29

Hey,

vielleicht kann mir jemand weiterhelfen. Ich habe einen ObjectContainer ...
class ObjectWrapper
{
    public ListItemWrapper(object basis)
    {
      this.basis = basis;
    }
 
    object basis;
 
    public object Basis
    {
      get
      {
        return this.basis;
      }
    }
 
    public override bool Equals(object obj)
    {
      return basis.Equals(obj);
    }
 
    public bool Equals(ObjectWrapper obj)
    {
      return base.Equals(obj);
    }
 
    public override int GetHashCode()
    {
      return basis.GetHashCode();
    }
 
    public override string ToString()
    {
      // Die Funktion uebersetze ist hier als Platzhalter zu sehen.
      // Es ist ja nur ein rudimentärer Auszug der Klasse.
      return uebersetze(basis.ToString());
    }
}
... diesen Benutze ich um den Text zu übersetzen der durch einen ToString()-Aufruf zurückgegeben wird. Das ist nützlich wenn man z.B. in eine ComboBox nicht Strings zu der Auflistung hinzufügen
will sondern eine komplettes Objekt. Die ComboBox ruft dann intern die ToString()-Funktion des Objektes auf. Das fange ich ab indem ich das Objekt vorher in den ObjectWrapper packe und dann erst
der ComboBox hinzufüge (Funktioniert auch für ListBoxen, CheckedListBoxen, ...). Jetzt aber zu meinem eigentlichen Problem^^. Wählt man in der ComboBox ein Item aus und will im Quelltext mit SelectedItem darauf zugreifen wird mein ObjectWrapper zurückgegeben. Ich möchte aber, damit man nicht immer daran denken muss, das das als Basis bezeichnete Objekt zurückgegeben wird. Beispiel:
  public partial class frmTest : Form
  {
    public frmTest()
    {
      comboBox1.Items.Add(new ObjectWrapper(new BasisItem("Hallo")));
      comboBox1.Items.Add(new ObjectWrapper(new BasisItem("Welt")));
    }
 
    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
      BasisItem beispiel = comboBox1.SelectedItem;
    }
  }
 
  class BasisItem
  {
    public BasisItem(string value)
    {
      this.value = value;
    }
 
    string value; 
 
    public override string ToString()
    {
      return value;
    }
  }
Leider habe ich keine Idee wie ich das Problem lösen könnte. Vielleicht hat hier jemand eine Idee.
Danke schon mal im Vorraus.

LG

PS: Für den Fall das der ValueMember bzw. der DisplayMember in der ComboBox gesetzt ist habe ich auch eine Lösung. Die habe ich aber nicht mit in die Beispielklasse oben mit eingefügt.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: ObjectWrapper kopieren 
Autor: IdC#
Datum: 07.05.12 14:23

Also nach langem hin und her ist es wohl am einfachsten eine Extension für jede Klasse zu schreiben die eine SelectedItem Eigenschaft beschreibt. Dann muss man nur daran denken diese Extension zu benutzen anstatt. Sähe dann so aus.
  public static class SelectedItemExtension
  {
    public static object GetSelectedItem(this ComboBox item)
    {
      return getObject(item.SelectedItem);
    }
 
    private static object getObject(object item)
    {
      if(item is ObjectWrapper)
      {
        return ((ObjectWrapper)item).Basis;
      }
      else
      {
        return item;
      }
    }
  }
 
  public partial class frmTest : Form
  {
    public frmTest()
    {
      comboBox1.Items.Add(new ObjectWrapper(new BasisItem("Hallo")));
      comboBox1.Items.Add(new ObjectWrapper(new BasisItem("Welt")));
    }
 
    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
      BasisItem beispiel = comboBox1.GetSelectedItem();
    }
  }
 
  class BasisItem
  {
    public BasisItem(string value)
    {
      this.value = value;
    }
 
    string value; 
 
    public override string ToString()
    {
      return value;
    }
  }
Weitere Lösungen können trotzdem noch gepostet werden!
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: ObjectWrapper kopieren 
Autor: ModeratorFZelle (Moderator)
Datum: 08.05.12 09:40

Den Sinn des ganzen kann ich nicht nachvollziehen.

Mit DisplayMember und ValueMember hast du doch genau was Du brauchst, und dann muss auch nichts hin und her gecasted werden.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: ObjectWrapper kopieren 
Autor: Micke
Datum: 08.05.12 11:07

Hi IdC#,

das es von MS für Lokalisierung eine Lösung gibt weißt du ?

falls ja, und du demnach was eigenes bauen willst:
du wirst nicht glücklich werden, wenn du auf BusinessObjektEbene (sprich dein wrapper) übersetzt, da ja mehrere übersetzungswürdige properties existieren können.
allein deshalb ist ToString dafür generell nicht geeignet.
Wenn dieser Weg, dann müßtest du schon den einzelnen Texten usw. Mehrsprachigkeit beibringen.
so z.B.:
public class MultiLingualString
{}
 
public class Report
{
public MultiLingualString Name {get;set;}
}
den Mechanismus zum Übersetzen selbst sehe ich dabei wenn im Control.
Und dann weiter wie Fzelle bereits schreibt.

Micke

Beitrag wurde zuletzt am 08.05.12 um 11:20:10 editiert.

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: ObjectWrapper kopieren 
Autor: IdC#
Datum: 08.05.12 11:59

Es geht nicht um die Sinnhaftigkeit meiner Lokalisierung.

Klar gibt es mehrere Eigenschaften die man übersetzen könnte. Ich habe das aber so gelöst indem ich die DisplayMember-Eigenschaft, wenn gesetzt, auf eine Eigenschaft der Wrapper-Klasse umleite. Den Originalwert der DisplayMember-Eigenschaft merke ich mir dann. Wenn dann auf die Eigenschaft meines Wrappers zugegriffen wird, greife ich mittels Reflection auf die Eigenschaft des Originalobjektes zu. Wenn der Rückgabetyp ein String ist, übersetze ich diesen. Wenn nicht gebe ich den Originalwert zurück. Aber wie gesagt diese Logik habe ich nicht in das Beispiel aufgenommen. Ich weiß auch das es eine MS-Lokalisierungslogik gibt. Aber meine Chefs haben entschieden eine eigene zu implementieren. Es geht aber auch gar nicht darum. Ich will doch nur wissen ob jemand weiß wie ich auf meine Basisklasse Verweise wenn ich folgendes mit der ComboBox mache:
BasisItem beispiel = comboBox1.SelectedItem;
Ich will dann nicht meinem Wrapper haben weil dann eine InvalidCastException geworfen wird. Ich habe es auch mit impliziter und expliziter Konvertierung auspropbiert. Aber durch Restriktionen von .NET bekomme ich dann folgende Fehlermeldung: user-defined conversions to or from a base class are not allowed
public static explicit operator object(ObjectWrapperitem)
{
  return item.Basis;
}
Der gleiche Fehler tritt auch bei der impliziten Konvertierung auf. Auch möchte ich vermeiden eigene Steuerelemente zu verwenden.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: ObjectWrapper kopieren 
Autor: Micke
Datum: 08.05.12 12:42

"Es geht nicht um die Sinnhaftigkeit meiner Lokalisierung."
kein Problem.

sofern du ein BasisItem in den wrapper steckst, könntest du es so zurückholen:

var ow = (ObjectWrapper)comboBox1.SelectedItem;
BasisItem beispiel = (BasisItem)ow.Basis;

Micke

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: ObjectWrapper kopieren 
Autor: IdC#
Datum: 08.05.12 12:51

Ja, das ist mir aber eine Zeile zu viel Code.
Ich möchte gerne das implizit richtig gecastet wird.
Wenn unsere anderen Programmierer die Lokalisierung nutzen, sollen sie nicht daran denken müssen zu Casten. Wenn es nicht anders möglich dann muss das eben in den Entwicklungsleitfaden mit aufgenommen werden.

Am besten gefiele mir ja:
BasisItem beispiel = comboBox1.SelectedItem;
wäre aber auch mit
BasisItem beispiel = (BasisItem)comboBox1.SelectedItem;
zufrieden.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: ObjectWrapper kopieren 
Autor: Micke
Datum: 08.05.12 18:19

dafür mußt comboBox1.SelectedItem überschreiben

Micke

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: ObjectWrapper kopieren 
Autor: IdC#
Datum: 08.05.12 18:36

Mit sowas habe ich gerechnet.
Ich helfe mir dann erstmal mit einer generischen Extension aus.
Irgendwie so:
public static T GetSelectedItem<T>(this ComboBox comboBox)
{
  if(comboBox.SelectedItem is ObjectWrapper)
  {
    return (T)((ObjectWrapper)comboBox.SelectedItem).Basis;
  }
  else
  {
    return comboBox.SelectedItem; 
  }
}
Mal sehen wann ich dazu komme die ComboBox zu erweitern.

Danke
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel