Добавьте все элементы массива в строки datagridview, кроме одного

Я читаю текстовый файл по строкам и вставляю его в массив.

Затем у меня есть этот список custIndex, который содержит определенные индексы, индексы массива items, которые я тестирую, чтобы проверить, являются ли они действительными кодами. (например, custIndex [0] = 7, поэтому я проверяю значение в элементах [7-1], чтобы узнать, действительно ли это в двух словарях, которые я здесь). Затем, если есть недопустимый код, я добавляю строку (массив элементов) в dataGridView1.

Дело в том, что некоторые из столбцов в dataGridView1 являются столбцами Combo Box, поэтому пользователь может выбрать правильное значение. Когда я пытаюсь добавить массив items, я получаю исключение: «В DataGridView произошло следующее исключение: System.ArgumentException: значение DataGridViewComboBoxCell недопустимо».

Я знаю, что поле со списком было правильно добавлено с правильным источником данных, так как если я просто добавлю несколько элементов в массив элементов в dataGridView1, например, как только элементы [0], поле со списком отлично отобразится, и никаких исключений не будет. Я думаю, проблема в том, что я пытаюсь добавить неправильное значение в массив items в строку dataGridView1.

Я не уверен, как с этим бороться. Есть ли способ добавить все элементы в элементы, кроме этого значения? Или я могу добавить значение из элементов и показать его в ячейке со списком вместе с заполненными выпадающими элементами?

if(choosenFile.Contains("Cust")) { var lines = File.ReadAllLines(path+"\\"+ choosenFile); foreach (string line in lines) { errorCounter = 0; string[] items = line.Split('\t').ToArray(); for (int i = 0; i <custIndex.Count; i++) { int index = custIndex[i]; /*Get the state and country codes from the files using the correct indices*/ Globals.Code = items[index - 1].ToUpper(); if (!CountryList.ContainsKey(Globals.Code) && !StateList.ContainsKey(Globals.Code)) { errorCounter++; dataGridView1.Rows.Add(items); } }//inner for if (errorCounter == 0) dataGridView2.Rows.Add(items); }//inner for each }//if file is a customer file 

Скажите, что ваш текстовый файл содержит:

Австралия PNG, Индия Африка
Австрия Бали Индонисия
Франция Англия, Шотландия, Ирландия Гренландия
Германия Багама Гавайи
Греция Колумбия, Мексика, Перу Аргентина
Новая Зеландия Россия США

И давайте скажем, что ваш DataGridView настроен на 3 столбца, а второй – поле со списком.

введите описание изображения здесь

Когда вы заполняете сетку и неправильно заполняете столбец combobox, вы получите сообщение об ошибке.

Способ его решения – «обработать / объявить явно» событие DataError и, что еще важнее, правильно заполнить столбец combobox.

 private void dataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e) { //Cancelling doesn't make a difference, specifying the event avoids the prompt e.Cancel = true; } private void dataGridView2_DataError(object sender, DataGridViewDataErrorEventArgs e) { e.Cancel = true; } 

Итак, представьте себе, что в 2-й колонке содержится раскрывающийся список стран, а 1-й и 3-й столбцы содержат текстовые поля.

Для 1-го и 3-го столбцов это просто строки, поэтому я создаю class для представления каждой строки:

 public class CountryData { public string FirstCountry { get; set; } public string ThirdCountry { get; set; } } 

Для 2-й колонки со списком ячеек «Страны» я создал отдельный class, потому что привяжу его к источнику данных 2-го столбца.

 public class MultiCountryData { public string[] SeceondCountryOption { get; set; } } 

Заполнение сетки столбцами combobox и тому подобное, как показано здесь: https://stackoverflow.com/a/1292847/495455 не является хорошей практикой. Вы хотите отделить свою бизнес-логику от своей презентации для более инкапсулированного, полиморфного и абстрактного подхода, который облегчит модульное тестирование и обслуживание. Следовательно, DataBinding.

Вот код:

 namespace BusLogic { public class ProcessFiles { internal List CountryDataList = new List(); internal List MultiCountryDataList = new List(); internal void foo(string path,string choosenFile) { var custIndex = new List(); //if (choosenFile.Contains("Cust")) //{ var lines = File.ReadAllLines(path + "\\" + choosenFile); foreach (string line in lines) { int errorCounter = 0; string[] items = line.Split('\t'); //Put all your logic back here... if (errorCounter == 0) { var countryData = new CountryData() { FirstCountry = items[0], ThirdCountry = items[2] }; countryDataList.Add(countryData); multiCountryDataList.Add( new MultiCountryData() { SeceondCountryOption = items[1].Split(',')}); } //} } } } 

В вашем проекте презентации приведен код кнопки:

  imports BusLogic; private void button1_Click(object sender, EventArgs e) { var pf = new ProcessFiles(); pf.foo(@"C:\temp","countries.txt"); dataGridView2.AutoGenerateColumns = false; dataGridView2.DataSource = pf.CountryDataList; multiCountryDataBindingSource.DataSource = pf.MultiCountryDataList; } 

Я установил dataGridView2.AutoGenerateColumns = false; потому что я добавил три столбца во время разработки; 1-й текстовый столбец, 2-й столбец со списком и третий столбец текста.

Трюк со связыванием второго столбца combobox является BindingSource . Во время разработки> щелкните правой кнопкой мыши по DataGridView> выберите «Редактировать столбцы»> выберите второй столбец> выберите «DataSource»> «Добавить проект DataSource> выберите« Объект »>, затем отметьте class multiCountry и нажмите« Готово ».

введите описание изображения здесь

введите описание изображения здесь

Также задайте имя DataPropertyName первого столбца для FirstCountry и имя DataPropertyName третьего столбца для ThirdCountry, поэтому, когда вы привязываете данные, сопоставление выполняется автоматически.

введите описание изображения здесь

Наконец, не забудьте установить свойство DataMember BindingSource для члена SeceondCountryOption classа SeceondCountryOption .

введите описание изображения здесь

Вот демонстрация кода http://temp-share.com/show/HKdPSzU1A