Если вы ищете ответ на вопрос об использовании DataSets, это не так.Вместо этого я хотел бы предложить альтернативное предложение: если возможно, не используйте DataSets.
(Это, конечно, вопрос предпочтения, но вот причина моего предложения:Недостатками данных, особенно когда они нетипизированного типа, является то, что они очень универсальны - они не обладают внутренним знанием того, какие объекты хранятся внутри них. Сравните это с вашими «логическими объектами», которые имеют представление о том, что ониЕсть, и какие возможности они могут иметь. Позже, когда вам нужно будет поддерживать ваш код, такие объекты будет гораздо проще для понимания, чем непрозрачный DataSet! Добавьте к этому тот факт, что вы, кажется, уже определили ваши доменные объекты ипохоже, в первую очередь возникают трудности с набором данных.)
Вместо использования DataSet
для вашего сценария я бы написал несколько классов провайдеров данных для этих логических объектов (Car
, Door
и Hinge
каждый получает свой соответствующий класс поставщика данных: ICarProvider
, IDoorProvider
, IHingeProvider
) и собирать необходимые данные из них при загрузке формы с данными.
var carId = ...;
Car car = carProvider.GetCarById(carId);
Затем вы делегируете загрузку данных двери классу Car
(поскольку двери «принадлежат»машина).Сделайте, чтобы у этого класса было свойство коллекции, Doors
(например, типа ICollection<Door>
).Внутри вашего Car
класса вы можете загружать данные дверей следующим образом:
public ICollection<Door> Doors { get; private set; }
private readonly IDoorProvider doorProvider = ...;
...
this.Doors = doorProvider.GetDoorsOfCar(this);
Аналогично, делегируйте загрузку данных петель классу Door
, так как петли логически «принадлежат» кдверь.Класс Door
будет иметь свойство Hinges
(опять же, например, типа ICollection<Hinge>
).Опять же, ваш класс Door
может загружать данные петель следующим образом:
public ICollection<Hinge> Hinges { get; private set; }
private readonly IHingeProvider hingeProvider = ...;
...
this.Hinges = hingeProvider.GetHingesOfDoor(this);
Когда вы затем загружаете свою форму, вы просто устанавливаете значения элементов управления на соответствующие свойства вашего объекта car
.
PS : Мой ответ содержит довольно много предположений о вашей объектной модели и отношениях между вашими объектами.Не стесняйтесь адаптировать мой ответ к объектной модели, которую вы на самом деле получили.
PPS : Вы могли бы даже пойти еще дальше.Для вашей формы определите различные пользовательские элементы управления, которые представляют одну дверь или одну петлю.Они могут получить свои данные непосредственно из Door
или Hinge
класса.Затем создайте пользовательский элемент управления, который может инициализировать себя из ICollection<Door>
(или ICollection<Hinge>
, соответственно), и который создает правильное количество дочерних элементов управления Door
/ Hinge
внутри себя.Таким образом, вы сможете использовать привязку данных для загрузки данных формы непосредственно из Car
объекта.
Ответ на первые два комментария от Джейка:
Нет,Я имел в виду что-то другое.Я сказал, что вы можете добиться большего успеха, чем использование DataSets.Я лично стремился бы к решению, которое вообще не использует DataSets.Я имел в виду что-то вроде этого:
interface ICarProvider
{
Car GetCarById(int id);
ICollection<Car> GetAllCars();
}
public CarProvider : ICarProvider { ... }
// ^ implementation that loads Car objects, e.g. from a relational database
public class Car
{
public int Id { get; private set; }
public ICollection<Door> Doors { get; private set; }
public Car(int id, IDoorProvider doorProvider)
{
this.Id = id;
this.Doors = doorProvider.GetDoorsOfCar(this);
}
...
}
public interface IDoorProvider
{
ICollection<Door> GetDoorsOfCar(Car car);
...
}
public class DoorProvider : IDoorProvider { ... }
// ^ similar to CarProvider, but loads data for Doors instead.
public class Door
{
public int Id { get; private set; }
public ICollection<Hinge> Hinges { get; private set; }
public Door(int id, IHingeProvider hingeProvider)
{
this.Id = id;
this.Hinges = hingeProvider.GetHingesOfDoor(this);
}
...
}
...
Затем вы привязываете данные к элементам управления вашей формы непосредственно к этим объектам (через someControlDisplayingCarData.DataSource = someCar;
), а не к DataSets.