Geschachtelte DataSource

Hallo

Ich wollte mal fragen, ob ich was falsch mache oder ob dies einfach so ist.
Ich habe drei Klassen mit jeweils einer Property (string, int und DateTime) (siehe Bildanhang).

class DsDateTime
{
	public DsDateTime(DateTime value)
	{
		this.Value = value;
	}

	public DateTime Value { get; set; }
}

public class DsNumber
{
	public DsNumber(int value)
	{
		this.Value = value;
	}

	public int Value { get; set; }
}

public class DsString
{
	public DsString(string value)
	{
		this.Value = value;
	}

	public string Value { get; set; }
}

Diese Klassen habe ich jeweils als Instanz in der Klasse “Kunde”. Die Klasse “Kunde” wird als Liste meiner DataSource zugeordnet.
Jetzt frage ich mich, wieso meine eigenen Klassen “DsString, DsNumber und DsDateTime” nicht unterhalb der LL-Variablen “Kunde” angezeigt werden sondern in der gleichen Ebene?

using combit.ListLabel19;
using LLSample.Datatype;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace LLSample
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            ListLabel LL = new ListLabel();

            IList<Kunde> list = new List<Kunde>();
                
            list.Add(CreateKunde("1111", 1, DateTime.Now));
            list.Add(CreateKunde("2222", 2, DateTime.Now.AddDays(1)));
            list.Add(CreateKunde("3333", 3, DateTime.Now.AddDays(2)));

            LL.DataSource = list;
            LL.Design();
        }

        private static Kunde CreateKunde(string name, int number, DateTime datum)
        {
            return new Kunde()
                {
                    NameDotNet = name,
                    NummerDotNet = number,
                    DatumDotNet = datum,

                    NameDs = new DsString(name),
                    NummerDs = new DsNumber(number),
                    DatumDs = new DsDateTime(datum)
                };
        }

        class Kunde
        {
            public DsString NameDs { get; set; }
            public DsNumber NummerDs { get; set; }
            public DsDateTime DatumDs { get; set; }

            public String NameDotNet { get; set; }
            public Int32 NummerDotNet { get; set; }
            public DateTime DatumDotNet { get; set; }
        }
    }
}

ll.JPG

Hallo Andrej,

vielen Dank für Ihren Beitrag.

Damit die Daten wie gewünscht angemeldet werden, empfiehlt es sich einen ObjectDataProvider zu verwenden und für diesen die Property FlattenStructure() auf True zu setzen. Bezogen auf Ihren Sample-Code ist dies relativ simple umsetzbar:

LL.DataSource = new ObjectDataProvider(list) { FlattenStructure = true }; LL.Design();
Mit freundlichen Grüßen

Christian Rauchfuß
Technischer Support
combit GmbH

Das ist ja wie ein wahrgewordener Traum :smiley:

Vielen Dank für dieses Feedback.
Funktioniert soweit super im kleinen Testbeispiel

Eine Zusatzfrage an der Stelle vielleicht noch:

Meine Properties aus dem Objekt “Kunde”, die von meinem eigenen Datentyp wie bspw. “NameDs” vom Typ “DsString” sind, werden im LL-Designer bei den Variablen als Struktur erkannt.
Ich kann dann den darunter liegenden “Value” verwenden.
Kann ich meinen Typ “DsString” in irgendeiner Weise erweitern (evtl Interface implementieren), sodass dieser analog “NameDotNet” angezeigt wird? Ich ihn also direkt mit “Kunde.NameDs” im LL-Designer ansprechen kann. Im Moment geht das leider nur mit “Kunde.NameDs.Value”.

Hintergrund der Frage: Die Klasse “String” oder “Int32” sind ja auch nur Wrapper und hier bekommt der LL-Designer dies auch direkt hin.

Danke für eine Antwort
Andrej

Hallo Andrej,

auch das ist möglich. Sie können den Namen der Felder im AutoDefineField-Event beeinflussen. Der Event wird für jedes angemeldete Feld durchlaufen:

[code] …
LL.DataSource = new ObjectDataProvider(list) { FlattenStructure = true };

        //trigger AutoDefineField event
        LL.AutoDefineField += LL_AutoDefineField;

        LL.Design();
    }

    private void LL_AutoDefineField(object sender, AutoDefineElementEventArgs e)
    {
        //change name
        if (e.Name == "Kunde.NameDs.Value")
            e.Name = "Kunde.NameDs";
        
    }[/code]

Mit freundlichen Grüßen

Christian Rauchfuß
Technischer Support
combit GmbH