Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von LaTino
Thema: SQLite - Daten per Query oder Linq filtern?
Am im Forum: Rund um die Programmierung

Schreibt net-PCL nicht das generierte SQL in die Debug-Ausgabe?

Müsste eigentlich. Wenn ja, kannst du ja vergleichen.

LaTino

Thema: Problem beim Zugriff auf generische Klasse, die in Interface gepackt ist...
Am im Forum: Rund um die Programmierung

@sth_wired, so etwa:


interface IMessage { }

class GenericMessage<T> : IMessage
{
    public T DataItem { get; set; }
}

static class IMessageExtensions
{
    public static object GetDataItem(this IMessage message) => message.GetType().GetProperty("DataItem")?.GetValue(message);
}

void GetDataItemTest()
{
    var myList = new List<IMessage>
    {
        new GenericMessage<int> { DataItem = 5},
        new GenericMessage<string> { DataItem = "hello, world"},
        new GenericMessage<ConsoleColor> { DataItem = ConsoleColor.Black }
    };

    myList.Select(p => p.GetDataItem().ToString()).ToList().ForEach(Console.WriteLine);
}

@Paladin: reicht Zugriff auf Implementierung, s.o....ist egal, hat sie ja beides nicht ;).

LaTino

Thema: Problem beim Zugriff auf generische Klasse, die in Interface gepackt ist...
Am im Forum: Rund um die Programmierung

Zitat von Palladin007
@LaTino:
Streng genommen ist ein GenericMessage<T> ein normaler Typ, zumindest behandelt .NET das als normalen Typ. An den kommst Du mit typeof(GenericMessage<>)

Das meinte ich nicht. Wären die Implementierungen von IMessage in der erhaltenen IEnumerable<IMessage> nicht generisch, dann könnte man bequem auf jede in der Liste enthaltene Instanz zugreifen, wenn man ihren Typ kennt.

Bei einer Implementierung von IMessage als generischer Typ geht das nicht, selbst wenn man weiß, welche Implementierung (hier: GenericMessage<>) benutzt wird: man muss schon den konkreten constructed type kennen. Das war mein Punkt. Generische Argumente kann man ausschließlich per Reflection oder per Selbstauskunft (zB über ein Property DataItem, das in einer Basisklasse oder dem Interface deklariert wird) erschließen.

Auf den generischen Typ kannst du eben nur casten, wenn du das generische Argument (und damit den constructed type) kennst. Ansonsten bleibt dir nur Reflection.

LaTino

Thema: Problem beim Zugriff auf generische Klasse, die in Interface gepackt ist...
Am im Forum: Rund um die Programmierung

Wenn es nicht per Reflection sein soll, müsstest du einen Basistypen einziehen, der DataItem abstrakt implementiert und von dem GenericMessage<T> erbt.

Der Irrtum bzw das Problem ist, anzunehmen, dass GenericMessage<T> ein Typ sei. Ist es nicht, deshalb kann man auch nicht auf GenericMessage<T> casten (sondern eben auf GenericMessage<int> usw., denn das sind Typen).

Wenn du die Möglichkeit einer abstrakten Basisklasse nicht hast - und es klingt so - solltest du es per Reflection in einer Extension lösen. (Auf propertyinfo "DataItem" testen und Wert extrahieren.)

LaTino

Thema: Javascript Chart mit Daten aus MVC Controller
Am im Forum: Web-Technologien

Zitat von Abt
Zitat
JSON Serializer wandelt meine DB Datumsfelder
JSON arbeitet eigentlich mit ISO 8601 und nicht mit Date(<Unix Timestamp>)
Was für ein Serializer soll das denn sein?

So einen Mist baut m.W. nur DataContractJsonSerializer. Was mich wundert, weil hier nirgends von einem WCF-Service die Rede war.

LaTino

Thema: Ist Mono geeignet für Sandbox Spiele wie Minecraft?
Am im Forum: Grundlagen von C#

Nochmal: nicht der GC ist schuld an schlechter Performance, der Entwickler ist es. Das scheint irgendwie nicht bei dir anzukommen. Das Konzept der Garbage collection ist nicht per se unperformant. Unreal engine, Unity 3D, cry engine (in Teilen)...benutzen alle garbage collection. "Wenn's an der Performance hapert, benutz ich halt unsafe"...oje.

LaTino

Thema: Visual Studio vs. Visual Studio Code für Webentwicklung
Am im Forum: Rund um die Programmierung

Ich habe nicht den Editor als Frickelei bezeichnet, sondern das Einrichten einer vernünftigen Arbeitsumgebung damit: passende Extensions raussuchen, vergleichen, installieren, einrichten. Das ist zusätzlicher Aufwand ggü einer Entwicklung in VS. Bitte nix unterstellen, was ich nicht gesagt habe :)

LaTino

Thema: Visual Studio vs. Visual Studio Code für Webentwicklung
Am im Forum: Rund um die Programmierung

Zitat von Abt
Gut gemeinter Rat: vermeidet die unnötigen Dependencies auf die Microsoft Packages und orientiert euch direkt an Angular.

Ich bezweifle gar nicht, dass das Arbeiten mit VSC an der Stelle viel glatter vonstatten gehen kann. Allerdings verlangt das eine Umstellung & Umgewöhnung der kompletten Arbeitsumgebung. Ich hab selber immer noch Schwierigkeiten, mich mit VSC als Editor anzufreunden. Die Frickelei mit Extensions hier installieren, da konfigurieren, wissen, welche man braucht etc pp - liegt mir nicht, interessiert mich eigentlich auch nicht, ich will einfach nur arbeiten. Wenn ich dann eine Möglichkeit finde - und sei es mit zusätzlichen Paketen - in meiner gewohnten Umgebung arbeiten zu können, dann tu ich das. Spart Zeit und Nerven - auch, wenn es aus Sicht derjenigen, die eben ein anderes Arbeiten gewohnt sind, wieder umständlich ist.

LaTino

Thema: Wie starte ich mit Angular und dem Visual Studio?
Am im Forum: Web-Technologien

Zitat von Coffeebean
Projekttyp im VS wäre dann eine ASP.NET Core Webanwendung und Clientseitig lädst du dir alle Abhängigkeiten mit Node bzw dem Node Package Manager (npm). Du kannst dir auch einen kleinen Webserver installieren (node serve, lite-server, webpack-dev-server, ...) mit dem du dann clientseitig entwickeln kannst. Das einzige, was dein Client vom Server kennt ist dann die URL.

Oder:

Kommandozeile, Templates installieren:
dotnet new --install Microsoft.AspNetCore.SpaTemplates::*

Kommandozeile, Verzeichnis anlegen...
mkdir MyNewAngularProject
cd MyNewAngularProject

Kommandozeile, Angular-Projekt erzeugen
dotnet new Angular
Erzeugte Projektmappe dann im VS2017 öffnen und warten, bis er die Abhängigkeiten aktualisiert hat. Dann kannst du wie gewohnt im VS loslegen.

LaTino
EDIT: Quelle und mMn mit großem Abstand bestes verfügbares Angular-mit-asp.net-core-Tutorial:
https://jonhilton.net/2017/02/21/create-a-vs2017-angular-2-and-net-core-site-using-the-command-line/

Thema: Base64 enkodierte Datenfelder aus Xml-Datei speichern
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Das angehängt Dokument ist zwar kein gültiges XML (da sind ein paar Knoten, die geschlossen, aber nicht geöffnet werden - vermutlich beim editieren passiert), aber es wird klarer, was du tun möchtest:

Aus allen Knoten "Dokument" den Inhalt des Unterknotens "Binardaten" in eine Datei mit dem Namen des Attributs "Dateiname" des Dokument-Knotens schreiben. Im Binardaten-Knoten stehen die Daten als byte-Array, base64-encoded. Richtig?

Du musst das ganze nicht auf Händen und Knien (XmlReader) machen. Mit Linq to XML sieht das so aus:


const string BASE_PATH = @"c:\temp";
const string XML_PATH = @"c:\pfad\zu\XML-Muster.xml";
const string FILENAME_ATTR = "Dateiname";
const string ELEMENT_BIN = "Binardaten";
const string ELEMENT_NAME = "Dokument";

XDocument.Load(XML_PATH).Root.Descendants(ELEMENT_NAME)
    .Where(p => p.Attribute(FILENAME_ATTR) != null && p.Element(ELEMENT_BIN) != null)
    .ToList()
    .ForEach(p => File.WriteAllBytes(Path.Combine(BASE_PATH, p.Attribute(FILENAME_ATTR).Value),
                    Convert.FromBase64String(p.Element(ELEMENT_BIN).Value)));

Also eine Zeile ;).

LaTino
EDIT: strings als Konstanten zwecks Übersicht/Anpassbarkeit

Thema: Ist Mono geeignet für Sandbox Spiele wie Minecraft?
Am im Forum: Grundlagen von C#

Garbage Collection ist eben nicht trivial. Wenn man in den Bereich kommt, wo man den GC tunen muss, wird es haarig. Dafür merkt man dann aber auch den Unterschied zwischen Entwicklern und Fricklern. Minecraft als Beleg für schlechte Java-Performance heranzuziehen ist genau so fair,, als würde ich BER als Beleg dafür nehmen, dass Deutschland die guten Ingenieure ausgehen. Beides Quatsch.

http://www.mono-project.com/docs/advanced/garbage-collector/sgen/

LaTino

Thema: Ist Mono geeignet für Sandbox Spiele wie Minecraft?
Am im Forum: Grundlagen von C#

Darf man fragen, wo du das her hast? Ich halte das für eine ziemlich abenteuerliche Behauptung.

LaTino

Thema: Ist Mono geeignet für Sandbox Spiele wie Minecraft?
Am im Forum: Grundlagen von C#

Die Performanceprobleme von Minecraft direkt auf Java zu schieben, halte ich für ziemlich naiv. Die gewählte Programmiersprache ist der letzte Schuldige.

LaTino

Thema: Wie bekomme ich bei JSON Deserialisierung die "[" und "]" Klammern weg?
Am im Forum: Netzwerktechnologien

Zitat von Sir Rufo
Oft muss man mit Attributen noch etwas Feinjustage betreiben (z.B. bei solchen Eigenschaftsnamen wie @code) und dann sieht man vor lauter Xml-, Json-, ... Serialisierungs-Attributen die eigentliche Klasse nicht mehr (wenn man eine Klasse für alle Formate definiert).

...oder man hat Eigenschaften, die sich gar nicht mit (Standard-)Attributen abbilden lassen (Namespace-Versionierung zB, man stelle sich für 10 verschiedene Versionen eines XML-Schemas vor, dass man jedesmal dasselbe Objekt wieder neu anlegen muss...gruselig). Der Punkt ist: es gibt Serialisierungs- und Deserialisierungsframeworks, und die können das vollständiger und vermutlich auch noch schneller, als wenn man das Problem von Hand löst. @TE: Daher, wie gesagt, arbeite mit fertigen Klassen.

LaTino

Thema: Wie mit altem, auskommentierten Sourcecode umgehen?
Am im Forum: Smalltalk

Zitat von HeikoAdams
Ich war der Meinung, das der weg kann, weil die Sourcen eh im git liegen und Code der auskommentiert ist so gut wie immer weg kann.

This. Kenne aber auch so ein paar Messies, die am liebsten nie was löschen würden, sondern nur auskommentieren (und natürlich noch Kommentare dazu, WARUM etwas auskommentiert wurde).

LaTino

Thema: Property, die nur einmal gesetzt werden kann
Am im Forum: Code-Reviews

Zitat von witte
und für mich wie eine Demonstration von NIH anhand von Lazy<T>.
Yep, war tatsächlich eine Motivation. Allerdings kein NIH - benötigt für net 2.0/CF.

LaTino

Thema: Wie bekomme ich bei JSON Deserialisierung die "[" und "]" Klammern weg?
Am im Forum: Netzwerktechnologien

Zitat von micha0827
also wäre jetzt der richtige Weg eine Klasse zu definieren und dann in die Klasse zu deserialisieren ? Dann gibt es ja auch wieder den Weg das als XML zu machen (der Anbieter bietet beide Varianten an). Ohne jetzt eine Grundsatzdiskussion anzufangen, findet Ihr JSON oder XML besser ? Spontan fällt mir da die geringere Datenmenge bei JSON ein.

Wenn du eine Klasse hast, in die du deserialierst, ist dir im besten Fall egal, woraus du es deserialisierst (ob json oder xml). Die Jungs, die dir deine Daten hier liefern, bieten ja auch beides an, und ich möchte doch sehr bezweifeln, dass sie das xml/json von Hand zusammenbauen ;). Diese beiden Formate stehen nicht in Konkurrenz, sie ergänzen einander. Genausogut könntest du fragen, ob man einen Kreuzschlitz- oder einen Schlitzschraubenzieher besser findet.

LaTino

Thema: Image laden ohne File zu blockieren
Am im Forum: Grafik und Sound

Etwas sauberer mit CopyTo/CopyToAsync.

EDIT: my bad. Framework 3.5.

LaTino

Thema: Property, die nur einmal gesetzt werden kann
Am im Forum: Code-Reviews

Hm, jein. Das gewünschte Verhalten an sich ist nix schlimmes, die Verwendung birgt in sich aber ein hohes Risiko, Probleme zu bereiten. (siehe Setteraufruf im Konstruktor, was eben wirklich in die Hose gehen kann und nicht offensichtlich ist). Tatsächlich sind hier die Tests für die betreffenden Komponenten unter denen, die am häufigsten rot werden. Nur ist der Einsatz gerechtfertigt und auch nicht ohne weiteres ersetzbar :). Wenn man's braucht, sollte man zusehen, ob man sein Design nicht so ändern kann, dass Variante eins - simples readonly - benutzt werden kann. Dann ist man auf der sicheren Seite, und bekommt obendrein sogar Compilerfehler, wenn man's falsch macht.

LaTino

Thema: Property, die nur einmal gesetzt werden kann
Am im Forum: Code-Reviews

Wie gesagt, wenn man etwas intensiver mit property injection arbeitet, kann das unter Umständen ganz hilfreich sein. Natürlich kann man property injection komplett mit c'tor injection abbilden, aber es ist nunmal situationsabhängig, welche Methode ich einsetze.

Bin etwas befremdet darüber, dass bestimmte Techniken abgelehnt werden, nur weil einem kein Beispiel einfällt, wofür man selbst das brauchen könnte. Wenn man xy erreichen will, hat man Möglichkeit a, b und c, das zu erreichen. Da muss ich doch nicht darübner diskutieren, dass man selbst noch nie xy erreichen wollte.

LaTino

EDIT:
Noch mal langsam:
- sinnvoll, um einen Wert einmalig mit etwas zu füllen, dass zur Konstruktion noch nicht verfügbar ist. Nennt es write-once lazy loading, jedenfalls mit einer Mechanik, die sicherstellt, dass nur einmal gesetzt wird. Dass das hilfreich ist, wenn -zig Leute am Code rumbauen, von denen nicht jeder weiß, dass die Prop gesetzt sein muss, und dass sie nur einmal gesetzt werden sollte, muss ich nicht wirklich erläutern?
- im Konstruktor einen Setter aufrufen? Soviel Masochismus habe ich dann doch nicht, danke :D.
- Ja, ich gestehe gern zu, dass das Sonderfälle sind. Es kann aber hilfreich sein, und wenn man es braucht, hat man die obigen drei Möglichkeiten, es einigermaßen sauber zu implementieren.

Thema: Mehrdimensionales assioatives array
Am im Forum: Grundlagen von C#

Vorsicht, antipattern: stringly typed programming. Alles in formlose Container packen und Key-Informationen als Zeichenketten speichern...bäks, wir sind doch nicht in VB6.

LaTino

Thema: Property, die nur einmal gesetzt werden kann
Am im Forum: Code-Reviews

Für readonly?

Die anderen Möglichkeiten sind ausschließlich dafür gedacht, die Beschränkung von readonly (Setzen ausschließlich im c'tor oder Deklaration) zu umgehen. So was ähnliches ist bei uns zB in den Factories im Einsatz, um die Stellen handlicher zu machen, die IoC per Property Injection realisieren. Oder du setzt eine readonly-Variable, die Werte benötigt, die im Konstruktor noch nicht verfügbar sind.

Letzten Endes alles Fälle, um die Art und Weise, wie eine Property benutzt wird, weiter einzuschränken, als die Sprache selbst das erlauben würde.

LaTino

Thema: Property, die nur einmal gesetzt werden kann
Am im Forum: Code-Reviews

Stimmt. Eine Möglichkeit, das zu tun, habe ich mal ergänzt.

LaTino

Thema: Bereitstellung einer Executable Datei (.NET Core) (Windows und Linux)
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Die .exe aus dem Debug-Ordner einfach rauszukopieren...dafür sollte man dir auch schon die Ohren lang ziehen!

Wenn du dir mal dein "Erstellen"-Menü genauer anschaust, wirst du dort einen Punkt "Veröffentlichen" finden. Da ist dein Startpunkt. (EDIT: eng. => Build-Publish)

Oder hier:

.NET Core Application Deployment

LaTino

Thema: Property, die nur einmal gesetzt werden kann
Am im Forum: Code-Reviews

(@mods: falls das doch in die snippets soll, nur zu, ich war mir unsicher)

Das Schlüsselwort [tt]readonly[/tt] kann auf Felder einer Klasse angewendet werden. Felder, die so markiert werden, können für nicht-statische Klassen nur direkt bei der Deklaration, oder im Konstruktor der Klasse gesetzt werden. Danach können sie nicht mehr verändert werden.
[csharp]
class ExampleClass
{
    private readonly int _readonlyField;

    public int ReadonlyProperty => _readonlyField;

    public ExampleClass(int readonlyValue)
    {
        _readonlyField = readonlyValue; //einziges Mal, dass die Variable gesetzt werden kann.
    }
}
[/csharp]
Diese Möglichkeit eignet sich für Werttypen - Zahlen zum Beispiel. Das Feld, in dem ihr Wert gespeichert wird, ist ein Nullable<T>, und der Setter des Property prüft, ob das Feld bereits einen Wert hat.

[csharp]
class ExampleClass
{
    private int? _nullableField;

    public int? ReadonlyProperty
    {
        get
        {
            if(_nullableField.HasValue) return _nullableField;
            throw new InvalidOperationException($"Field {nameof(_nullableField)} has not been set (yet)!");
        }
        set
        {
            if(_nullableField.HasValue) throw new InvalidOperationException($"Field {nameof(_nullableField)} has already been set!");
            _nullableField = value;
        }
    }
}
[/csharp]
Ein Set-Memory ist einfach eine Variable, in der gespeichert wird, ob eine Property gesetzt wurde oder nicht. Diese Möglichkeit eignet sich für alle Typen, funktioniert aber nur, wenn der Set-Memory auch wirklich jedesmal gesetzt wird, wenn die Property sich ändert.
[csharp]
class ExampleClass
{
    private bool _setMemory;
    private int _readonlyProperty;

    public int ReadonlyProperty
    {
        get { return _readonlyProperty; }
        set
        {
            if (!_setMemory)
            {
                _readonlyProperty = value;
                _setMemory = true;
            }
            else throw new InvalidOperationException($"Field {nameof(_readonlyProperty)} has already been set!");
        }
    }
}
[/csharp]
Die in Möglichkeit drei beschriebene Vorgehensweise lässt sich natürlich noch in eine eigene Klasse kapseln, so dass die Übersicht in der benutzenden Klasse nicht verloren geht.

(Vorschlag T-Virus)
[csharp]
class ExampleClass
{
    private readonly SetAnywhereReadonly<int> _readonlyValue = new SetAnywhereReadonly<int>();

    public int ReadonlyProperty
    {
        get => _readonlyValue.Value;
        set => _readonlyValue.Value = value;
    }
}

class SetAnywhereReadonly<T>
{
    private bool _setMemory;
    private T _value;

    public T Value
    {
        get => _value;
        set
        {
            if (!_setMemory)
            {
                _value = value;
                _setMemory = true;
            }
            else throw new InvalidOperationException($"Field {nameof(_value)} has already been set!");
        }
    }
}
[/csharp]

LaTino
(ruhig ergänzen / diskutieren)
EDIT: Vorschlag von T-Virus ergänzt

Thema: Funktionsweise des IComparers
Am im Forum: Grundlagen von C#

Zitat von Luca_Aust
@LaTino

Kannst du mir einmal genau erklären was :



BagObject[] bagObjectList = Enumerable.Range(0, objectCount).Select(p => new BagObject.....


Ich kann damit ehrlich gesagt nicht so viel mit anfangen.

Deshalb habe ich darunter noch eine andere Schreibweise aufgeschrieben, die dasselbe macht. Wörtlich übersetzt macht der Code das hier:

- für eine Menge von Zahlen (und zwar <objectCount> viele) (Enumerable.Range(0, objectCount)
- erstelle pro Zahl eine Instanz der Klasse BagObject (Select p => new BagObject())
- sortiere nach der Eigenschaft "Efficiency") (OrderBy(p => p.Efficiency)
- und liefere die Ergebnismenge als Array (ToArray())

Alles zusammen:


BagObject[] orderedBagObjectList = Enumerable.Range(0, objectCount).Select(p => new BagObject
{
    Name = GetRandomName,
    Mass = GetRandomNumber(),
    Price = GetRandomPrice()
}.OrderBy(p => p.Efficiency).ToArray();


Ist nur eine Art, Dinge aufzuschreiben. Eine for-schleife wäre eine andere Art, diese hier nennt man Linq.

Davon abgesehen ist die Efficiency-Eigenschaft, nach der du sortieren möchtest, kaputt. Abt hat schon angedeutet, was da verkehrt ist. Ich glaube aber, der Sinn dahinter war, dass du eine Read-Only-Eigenschaft haben möchtest, die nur ein einziges Mal gesetzt wird und dann nie wieder verändert werden soll. Und ob sie gesetzt ist, erkennst du daran, dass sie nicht 0 ist.

Das ist
a) ein ganz furchtbarer Ansatz, weil eine Efficiency von 0 durchaus Sinn ergeben würde, deine Klasse das aber nicht abbilden kann und
b) das Rad neu (und schlechter) erfunden, denn so eine Mechanik existiert bereits. Eigentlich existieren sogar mehrere Möglichkeiten. Aber das sollte Thema eines anderen Threads sein.

LaTino
EDIT: Thread ergänzt

Thema: Funktionsweise des IComparers
Am im Forum: Grundlagen von C#

Zitat von Sir Rufo
Mal ne doofe Frage:

Wo seht ihr hier einen IComparer? Ich sehe nur etwas, was man einem Comparison<T> zuweisen könnte. ;)

Ich hatte ihn so verstanden, dass er einen IComparer schreiben wollte, aber irgendwie durcheinandergekommen und beim Comparison<T>-Delegaten hängengeblieben ist. So richtig gibt das sein Posting aber nicht her, da haste Recht :D.

LaTino

EDIT: bezeichnungen korrigiert

Thema: Funktionsweise des IComparers
Am im Forum: Grundlagen von C#

IComparer selbst sortiert nicht. Die Schnittstelle stellt lediglich die Funktion eines Vergleichs bereit, wie auch immer der aussieht. Und wer einen Vergleich braucht, um irgendwas zu tun, der kann eben eine IComparer-Implementierung verwenden. Ein Beispiel wäre ein Sortieralgorithmus: jeder Sortieralgorithmus muss in irgendeiner Weise durch die zu sortierende Liste gehen, und deren Elemente miteinander vergleichen sowie gegebenenfalls dann eben ihre Reihenfolge ändern.

Wenn du also einen Sortieralgorithmus hast, der so implementiert ist, dass man ihm einen IComparer geben kann, dann wird auch nach den Kriterien sortiert, die du im IComparer vorgegeben hast.


var sortedList = unsortedList.Sort(new MyComparer()); //sort ist der Algorithmus, dem man eine Vergleichsmethode geben kann,

Du solltest auch überlegen, ob in deinem Fall es nicht sinnvoller ist, wenn BagObject IComparable implementiert. (IComparable<T> vs. IComparer<T> ist dabei Thema vom Selbststudium ;) ).

LaTino

Noch ein paar kleine Anmerkungen zum geposteten Code:
- ValueOfObjects scheint eine Zahl zu sein. Wenn diese Zahl eine Anzahl ist, würde ich sie auch so nennen: ObjectCount zum Beispiel.
- Anstatt Objekte einzeljn zu erzeugen, zu füllen und dann in eine Liste zu packen, mach doch alles in einem Aufwasch:


BagObject[] bagObjectList = Enumerable.Range(0, objectCount).Select(p => new BagObject 
{ 
    Name = GetRandomName,
    Mass = GetRandomNumber(),
    Price = GetRandomPrice()
}.ToArray();

//oder, wenn eine gute alte for-schleife angenehmer für die Augen ist:
private IEnumerable<BagObject> GenerateObjects()
{
     for(int i = 0; i < ObjectCount; i++)
         yield return new BagObject 
        { 
            Name = GetRandomName,
            Mass = GetRandomNumber(),
            Price = GetRandomPrice()
        };
}
//Anwendung: BagObject[] objectList = GenerateObjects().ToArray();

@Palin: dieser 0-Vergleich ist ein etwas verquerer Vergleich für nicht-initialisierte Werte. Würde ich ganz rauswerfen.

Thema: Unterschiede DataGridViewComboBoxCell vs Combobox
Am im Forum: GUI: Windows-Forms

War missverständlich. "Geeignete Stelle" meint hier eine geeignete Stelle im Lebenszyklus des Windows-Forms. Überleg mal, was passiert, wenn du deine Daten zu früh an die Combobox bindest und danach erst die Daten ins Grid geschaufelt werden...genau. Dann wäre die Combobox-Auswahl wieder leer, also genau so, wie du das erlebst.

LaTino

Thema: Unterschiede DataGridViewComboBoxCell vs Combobox
Am im Forum: GUI: Windows-Forms

Möglich ist immer alles.


//...geeignete Stelle suchen...
myGridView.Rows[specialRow].Cells[specialColumn] = new DataGridViewComboBoxCell { DataSource = {"1", "2", "3"} };

Dein Problem (wieso die Combobox leer bleibt) dürfte damit zusammenhängen, dass du das Binding nicht an einer geeigneten Stelle setzt. 's gibt dafür ein Ereignis, das beim Befüllen des Gridviews triggert.

LaTino