C# BindingSource mit komplexen Datentyp an DataGridView binden

HaGGi.13

Ensign
Registriert
März 2008
Beiträge
215
Hi Leute,

jetzt muss ich mich auch mal mit ein Problem an euch wenden.
Vorweg:
Ich Arbeite mit einem DataGridView (im weiteren Verlauf „DGV“ genannt) an welcher ich per .DataSource ein BindingSource (im weiteren Verlauf „BS“ genannt) gebunden habe. Das BindingSource beinhaltet einen komplexen Datentyp, welcher in sich wieder komplexe Datentypen beinhaltet.
Hier der Datentyp:

Code:
public class HotlineContract
{
    #region Fields
    private IDataController controller_ = null;

    private EmployeeContract employee_ = null;
    private StoreContract store_ = null;
    #endregion

    #region Properties
    public int HotlineID
    { get; set; }

    public string F_StoreNumber
    { get; set; }
    
    public int F_EmployeeID
    { get; set; }

    public string CreationDateTime
    { get; set; }

    public string StoreEmployee
    { get; set; }

    public string Problem
    { get; set; }

    public string Solution
    { get; set; }

    public string EditDateTime
    { get; set; }


    public EmployeeContract Employee
    {
        get
        {
            this.employee_ = this.controller_.GetEmployee_ByHotline(this);
            return this.employee_;
        }
    }

    public StoreContract Store
    {
        get 
        {
            this.store_ = this.controller_.GetStore_ByHotline(this);
            return this.store_; 
        }
    }
    #endregion


    #region CTor 
    public HotlineContract()
    {
        this.controller_ = DataControllerHolder.ControllerHolder.Controller;
    }
    public HotlineContract(IDataController controller)
    {
        this.controller_ = controller;
    }
    #endregion
}

Mich interessiert hier speziell nur der Datentyp „Employee“ und daher hier der Aufbau dieses Datentypes:

Code:
public class EmployeeContract
{
    #region Fields
    private IDataController controller_ = null;

    private List<CashpointContract> cashpoints_ = null;
    private List<HotlineContract> hotlines_ = null;
    #endregion

    #region Properties
    public int EmployeeID
    { get; set; }

    public string Name
    { get; set; }
 
    public bool Status
    { get; set; }


    public List<CashpointContract> Cashpoints
    {
        get
        {
            this.cashpoints_ = this.controller_.GetAllCashpoints_ByEmployee(this).ToList();
            return this.cashpoints_;
        }
    }

    public List<HotlineContract> Hotlines
    {
        get
        {
            this.hotlines_ = this.controller_.GetAllHotlines_ByEmployee(this).ToList();
            return this.hotlines_;
        }
    }
    #endregion


    #region CTor
    public EmployeeContract()
    {
        this.controller_ = DataControllerHolder.ControllerHolder.Controller;
    }
    public EmployeeContract(IDataController controller)
    {
        this.controller_ = controller;
    }
    #endregion
}

Nun zu meinem Problem:
Da das BS an das DGV (per Designer) gebunden wurde, wurden auch die entsprechenden Spalten automatisch erstellt, soweit so gut. Nun ist es aber so, dass in der Spalte „Employee“, nur der Pfad des komplexen Datentyps zu sehen ist. Ich möchte aber speziell die Eigenschaft „Name“ für diese Column abrufen. Daher war meine erste Idee die Eigenschaft .DataPropertyName auf „Name“ zu setzen. Das bewirkt allerdings nur, dass gar nichts mehr in dieser Spalte angezeigt wird, sie also leer ist.
Zum weiteren Verständnis hier mal die .DataSource Belegung:
(Das BindingSource wird mit Hilfe eines LINQ Statements mit Daten aus einer SQL-Datenbank gefüllt.)

Code:
this.dgvtestBindingSource.DataSource = this.hotlineContractBindingSource;

Hat vielleicht jemand eine Idee oder einen Tipp für mich, wie ich das elegant und performant realisieren kann? Ich sitze schon etwas länger an dieser Problematik und möchte es nicht wieder so lösen, dass ich Zeile für Zeile und Spalte für Spalte einzeln dem DGV hinzufügen muss. Denn dieses DGV wird später mehrere 1000 Datensätze darstellen müssen und diese sollen wenn möglich auch in einer angemessen Zeit geladen werden. :)

Ich hoffe es hat wer einen Anhaltspunkt für mich den ich noch nicht kenne oder ausprobiert habe und ich hab genug Infos gegeben.

Danke.
 
Naja an der Stelle müssen wir etwas tricksen. Der Binder macht ja nichts weiter als ToString von dem Element aufzurufen. Heißt also du überschreibst die ToString - Methode in deiner Employee Klasse und gibst da den Namen zurück. Kommt mir irgendwie bekannt vor dein Code :p
 
He he... ach was echt?
Wie kommt das bloß? ;)

Hmmm... so richtig toll finde ich das nicht, da ich lieber das gesamte Objekt holen möchte um dann die Eigenschaft abzurufen, aber das wäre schon mal eine Möglichkeit.
 
Naja das macht ja an und für sich keine Probleme, aufgrund der Tatsache das deine Hotline Bindingsource an das Steuerelement gebunden ist und wenn du dann ein geklicktes Item auswählst, kannst du immernoch über Hotline.Employee auf die eigentliche Person Zugreifen, wir ändern ja nur die Anzeige, nicht die Objekte.
 
Zurück
Oben