+1 800 256 3608 (toll-free in North America) or +49 7531 90 60 10| service@combit.com

WebDesigner Felder und Variablen

dataprovider
webdesigner
designer

(Dirk Haschke) #1

Hallo zusammen,
ich habe unter ASP.NET MVC erfolgreichen den Webdesigner eingebunden, stehe aber jetzt vor dem Problem Felder und Variablen mitzugeben.
Ich kann im WebDesignerLauncher über AsVariables bzw. AsFields steuern wie myclass behandelt wird.

    MyClass myclass = new MyClass();
    myclass.c1 = "C";
    options.AutoMasterMode = LlAutoMasterMode.AsVariables;  // AsFields
    options.DataSource = new ObjectDataProvider(myclass);
    options.DataMember = "MyClass";

Aber dazu gibt es natürlich auch noch Fields, so dass das über DataProviderCollection laufen muss.

    providerCollection.Add(new ObjectDataProvider(myclass));
    List<MyFields> myfieldlist = new List<MyFields>();
    MyFields f1 = new MyFields();
    MyFields f2 = new MyFields();
    myfieldlist.Add(f1);
    myfieldlist.Add(f2);
    providerCollection.Add(new ObjectDataProvider(myfieldlist));

So erscheinen aber beide unter den Fields im Designer. myclass soll aber bei den Variables stehen.
Kann mir jemand sagen, was ich falsch mache?
VG D


(combit - Jochen Bartlau) #2

Idealerweise wären die MyFields ein Member von MyClass, dann würde die Beziehung automatisch hergestellt. Ansonsten sollten die im anderen Thread angesprochenen CrossProviderRelations helfen.


(Dirk Haschke) #3

Das klappt leider auch nicht.
public class A
{
public string ina;
}

public class B
{
    public string inb;
    public List<A> alist;
}

public static class MyData
{
    public static DataProviderCollection FillMyData()
    {
        DataProviderCollection providerCollection = new DataProviderCollection();

        B myb = new B();
        myb.inb = "b1";
        myb.alist = new List<A>();
        A a1 = new A();
        a1.ina = "a1";
        myb.alist.Add(a1);
        A a2 = new A();
        a2.ina = "a2";
        myb.alist.Add(a2);

        providerCollection.Add(new ObjectDataProvider(myb));
        return (providerCollection);
    }
}

So ist alles wieder alles bei den “Feldern”.
grafik

Sorry, irgendwie kann ich mein Problem wohl nicht richtig ausdrücken:
Ich möchte einen Teil, die “statischen” Daten bei den Variablen und die “laufenden” bei den Feldern.
Das klappt aber zusammen irgenwie nicht.
Danke Dirk


(combit - Jochen Bartlau) #4

Sie brauchen gar keine ProviderCollection. Nehmen SIe als Beispiel unsere Klasse Customer aus dem ObjectDataProvider-Beispiel der Installation:

class Customer
{
    //Constructor
    public Customer(int customerID, string companyName, string contactName, string address, string city)
    {
        CustomerID = customerID;
        CompanyName = companyName;
        ContactName = contactName;
        Address = address;
        City = city;
        OrderList = new List<Order>();
    }

    public List<Order> OrderList { get; set; }

    // D: Die CustomerID soll nicht im Designer zur Auswahl verfuegbar sein
    // US: The CustomerID should not be available in the designer
    [Browsable(false)]
    public int CustomerID { get; set; }
    public string CompanyName { get; set; }

    // D: Setze Property-Name, welcher im Designer verwendet werden soll
    // US: Set property name, which should be used in the designer
    [DisplayName("Name")]
    public string ContactName { get; set; }
    public string Address { get; set; }
    public string City { get; set; }
}

Die Daten werden in etwa so gefüllt:

public static List<Customer> GetGenericList()
{
    List<Customer> customerList = new List<Customer>();

    //D: Mehrere Kunden erstellen
    //US: Create some customers
    Customer customer1 = new Customer(1, "Joe's Tatoo", "Joe Smith", "Kingstreet 2a", "Queens");
    Customer customer2 = new Customer(2, "Tec n Toc", "Peter Bush", "Park Avenue", "NewYork");
    Customer customer3 = new Customer(3, "Sunshine Agency", "Brian Holiday", "Island Road 1", "Zurich");
    Customer customer4 = new Customer(4, "Hiking Store", "Sandra Mountain", "Hillstreet 6", "Garmisch");

    //D: Die Bestellungen fuer den ersten Kunden definieren
    //US: Define orders for the first customer
    customer1.OrderList.Add(new Order(1, new DateTime(2006, 1, 20), "Nils van de Glocke", "Houston", 14.64));
    customer1.OrderList.Add(new Order(2, new DateTime(2006, 6, 21), "Bruce White", "New Orleans", 214.00));
    customer1.OrderList.Add(new Order(3, new DateTime(2006, 3, 1), "Kurt Muster", "Berlin", 6420.00));

    //D: Die Bestellungen fuer den zweiten Kunden definieren
    //US: Define orders for the second customer
    customer2.OrderList.Add(new Order(4, new DateTime(2005, 12, 3), "Bill Bunny", "Frankfurt", 640.99));

    //D: Die Bestellungen fuer den dritten Kunden definieren
    //US: Define orders for the third customer
    customer3.OrderList.Add(new Order(5, new DateTime(2006, 4, 3), "Mia Rust", "Madrid", 56.60));
    customer3.OrderList.Add(new Order(6, new DateTime(2006, 4, 16), "Mia Rust", "Madrid", 450.00));
    customer3.OrderList.Add(new Order(7, new DateTime(2006, 4, 25), "Mia Rust", "Madrid", 1585.00));

    //D: Die Bestellungen fuer den vierten Kunden definieren
    //US: Define orders for the fourth customer
    customer4.OrderList.Add(new Order(8, new DateTime(2006, 6, 6), "Steve Random", "Vienna", 990.00));

    //D: Die einzelnen Kunden in die Kundenliste aufnehmen
    //US: Add the single customers to the customer list
    customerList.AddRange(new Customer[] { customer1, customer2, customer3, customer4 });

    return (customerList);
}

Dann kann ich den Provider so instanzieren:

var provider = new ObjectDataProvider(GenericList.GetGenericList());

// D: Den vom Designer verwendeten Tabellennamen festlegen (optional)
// US: Declare a name for the table, which will be used in the designer (optional)
provider.RootTableName = "Customer";
LL.SetDataBinding(provider, "Customer");
LL.AutoMasterMode = LlAutoMasterMode.AsVariables;
LL.AutoProjectFile = "IEnumerable.lst";
LL.Design();

und erhalte im Designer

image

So sollte es auch mit Ihrer Datenquelle funktionieren :slight_smile: .


(Dirk Haschke) #5

Das sieht sehr gut aus, probiere ich morgen in Ruhe.
Vielen Dank


(Dirk Haschke) #6

Leider lassen die “optionen” beim WebDesinger das so nicht zu, kann ich dem das anders mitgeben.
Bei den “MVC Web Reporting Sample” gibt es das Customer Beispiel leider auch so nicht.


(combit - Jochen Bartlau) #7

Mein Beispiel bezog sich auf eine Client-Anwendung. Beim WebDesigner müssen Sie die Eigenschaften über die WebDesignerOptions setzen, in etwa so:

// D:   Lade die zum Report passende Datenquelle.
// US:  Get the corresponding data source for the report.
ObjectDataProvider provider = new ObjectDataProvider(GetGenericList()); // hier muss Ihr Objekt stehen
provider.RootTableName = "Customer"; // hier der Name der Tabelle, die Sie als Variablen haben wollen
options.DataSource = provider;
options.DataMember = "Customer"; // hier der gleiche Name wie oben
options.AutoMasterMode = LlAutoMasterMode.AsVariables;

(Dirk Haschke) #8

Jetzt klappt es
1000 Dank


(Dirk Haschke) #9

Noch einmal vielen Dank,
bin aber jetzt leider auf ein neues Problem gestossen.
Wenn ich aus VS2017 starte funktioniert alles prima, auf dem echten Server kommt jedoch leider folgende Meldung:


gefolgt von (nach drücken auf “Anwenden”)

könnten Sie mir dabei bitte noch einmal unter die Arme greifen, Danke Dirk


(combit - Jochen Bartlau) #10

Da würde ich Ihnen empfehlen, sich einmal beim Support zu melden - das müssten wir hier vermutlich am lebenden Objekt debuggen. Ein erster Schritt könnte auch ein Blick in die Logdatei und das Updaten auf die aktuellste 22er-Version sein, vielleicht kann das schon helfen.