Похоже, ваш подход к работе с dataGridView немного неправильный. Вы пытаетесь работать со строками сетки данных напрямую, но идея состоит в том, чтобы иметь отдельную коллекцию, подобную List<Product>
, и отображать ее через источник привязки.
1. Сначала создайте класс, представляющий ваш продукт, например:
public class Product
{
public string Title { get; set; }
public string Asin { get; set; }
}
2. Создайте список продуктов и добавьте их в этот список.
3. Нажмите на dataGridView в конструкторе форм и обратите внимание на кнопку со стрелкой в правом верхнем углу. Нажмите на него и сгенерируйте новый источник данных, выбрав класс Product
. DataGridBindingSource появится в нижней части дизайнера форм. Давайте предположим, что его зовут dataGridViewBindingSource
.
4. Присвойте свою коллекцию продуктов источнику привязки:
dataGridViewBindingSource.DataSource = products;
Теперь вы можете изменить коллекцию продуктов и отобразить обновленные продукты в сетке, вызвав метод dataGridView.Refresh()
. На этом этапе вам следует избавиться от исключения «Индекс вне диапазона», и у вас есть ссылка на коллекцию ваших продуктов, поэтому вам не нужно явно «извлекать» их из строк сетки данных.
5. Вместо получения значений из ComboBox вы можете сначала сохранить параметры в продукте, а затем добавить их в комбинированный список.
Если бы я был Вами, то я выставил бы события от интерфейса Вашего представления. Это позволило бы Вам делать контроллер центральным ко всему взаимодействию.
Контроллер загрузился бы сначала и инстанцировал бы представления, я буду использовать внедрение зависимости так, чтобы Вы не создавали зависимость от самого представления, но только в интерфейсе. Контроллер получил бы доступ к модели и данным загрузки в представление. Контроллер связал бы с событиями, определенными в интерфейсе представления. Контроллер затем обработал бы сохранение данных назад к модели через событие.
Если бы Вы хотели Вам, то мог бы также использовать брокера события, который освободил бы потребность объявить интерфейс на представление. Таким образом, Вы могли связать с событиями через атрибуты.
Это оставило бы Вас с Контроллером, являющимся зависящим от модели и интерфейса представления, при этом представление было бы зависящее от данных только и модели, имеющей зависимости.
Некоторые примеры вышеупомянутых взглядов дизайна могут быть найдены в CAB и Умной Ссылке Фабрики клиентского программного обеспечения На Умный Клиент. Они используют шаблон MVP, но он мог одинаково легко быть применен к шаблону MVC.
Вообразите этот GUI:
Единица Zergling представлена пользователю как посторонний значок. Вы видите, что это находится в своей неактивной анимации. Назовите это Представлением.
Игровые движения единица путем нажатия на него и целевое местоположение. Можно заменить плеером AI, если Вы хотите. Назовите это Контроллером.
Диапазон HP и нападения единицы вычисляется каждый игровой кадр, когда единица находится в бою. Можно изменить эти данные для превращения Zergling в единицу диапазона. Назовите это Моделью.
Помните об этой аналогии и расширьте ее для своих проектов MVC.
Почти каждой платформой GUI (от MFC до SWT, ко что) уже является базирующийся MVC. На самом деле шаблон MVC был сначала создан Smalltalk-80 и позже первый действительно используемый для разработки GUI.
Проверьте дважды и посмотрите на стандарты и предложенные методы для Вашего предпочтительного инструментария GUI. Иногда MVC не будет хорошим шаблоном для работы с при решении определенной проблемы или работе с конкретным инструментарием.
Помните: MVC является большим шаблоном, но не является единым решением, не пытайтесь вызвать проблему в MVC, когда основанное на событии или функциональное программирование стиля сделает Вашу жизнь легче.
Важная вещь для Вас для запоминания, то, что в установке MVC Контроллер должен знать, какое Представление назвать, но Представление не должно знать ничего из Контроллера.
Таким образом, Ваше Представление должно обеспечить обобщенный путь к Контроллерам для взаимодействия с ним, так, чтобы у Вас могло быть несколько других вызовов Контроллеров то же Представление (стандартизированный вывод графических данных некоторых данных, обеспеченных как параметр, например).
Это дает Вам гибкость:
Если Вы сохраняете свое Представление отсоединенным от определенных Контроллеров и помещаете знание, о котором Представлении звонить от Вашего Контроллера, Вы хорошо на пути.
Ваш контроллер должен определенно связать с событиями, определенными в интерфейсе реализации представления.
Как Вы идете о выполнении, это может быть хитрой частью. Внедрение зависимости? Фабрика представления? Имеет представление, инстанцируют контроллера, который оно хочет? Это действительно зависит от того, как сложный приложение будет.
Для чего-то действительно быстрого и простого я запустил бы с наличия каждой конструкции представления, это - контроллер, и затем посмотрите на другие опции, если это должно было стать больше. Лично я думаю, что полная платформа внедрения зависимости является излишеством для полудюжины форм:]