Добавление / удаление / выбор значений ComboBox в DatagridView

Я пытаюсь автоматизировать задачу обработки данных для файлов различных форматов и полей. Я создал программу, которая определяет разделитель файла с разделителями и загружает часть файла в DataGridView в форме, чтобы пользователь мог подтвердить некоторые поля файла до массовой загрузки файла в таблицу SQL., Таблица будет создана на лету с использованием некоторых имен полей, выбранных пользователем в поле со списком в таблице данных.

Это моя цель, но я не уверен, что правильно подхожу к проблеме.

На данный момент я создал BindingSource для выпадающих списков...

BindingSource bindingSource = new BindingSource();

Здесь я показываю DataGridView выбранного файла, добавляя столбец для каждого поля в файле данных

    private void ShowDataGridView(string file, string delimiter, string[] fieldNames, string[] fieldLengths)
    {
        StreamReader fileReader = new StreamReader(file);
        if (bindingSource.Count == 0)
        {
            bindingSource.Add("FIRSTNAME");
            bindingSource.Add("LASTNAME");
            bindingSource.Add("ADDRESS1");
            bindingSource.Add("ADDRESS2");
            bindingSource.Add("CITY");
            bindingSource.Add("STATE");
            bindingSource.Add("ZIP");
            bindingSource.Add("COMPANY");
            bindingSource.Add("EMAIL");
            bindingSource.Add("");
        }           
        dataGridView1.Rows.Clear();
        dataGridView1.Columns.Clear();
        int count = 0;
        for (int i = 0; i < 17; i++)  //read 17 lines into datagridview for field confirmation, 17 lines just so happens to fill my datagridview nicely, last row will be combobox for field name selection
        {
            string[] fields = StringFunctions.Split(fileReader.ReadLine(), delimiter, Convert.ToString("\""));
            count = fields.Count();
            if (i == 0)
            {
               // Adding Column Header to DataGridView
                for (int x = 0; x < count; x++)
                {
                    DataGridViewTextBoxColumn columnDataGridTextBox = new DataGridViewTextBoxColumn();
                    columnDataGridTextBox.Name = fieldNames[x];
                    columnDataGridTextBox.HeaderText = fieldNames[x];
                    dataGridView1.Columns.Add(columnDataGridTextBox);
                }
            }
            dataGridView1.Rows.Add(fields);
        }

        for (int x = 0; x < count; x++)
        {
            DataGridViewComboBoxCell combobox = new DataGridViewComboBoxCell();             
            combobox.DataSource = bindingSource;
            dataGridView1[x, 16] = combobox;  //remember 17 rows added, combobox will be last row in datagridview
            combobox = null;
        }
        dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;

        fileReader.Close();
        fileReader = null;
    }

Итак, теперь у меня есть представление данных и списки для всех полей данных. Некоторые поля являются обязательными (имена полей BindingSource). Я хочу, чтобы пользователь мог выбрать подходящее имя поля для столбца данных в выпадающем списке. Когда пользователь выбрал поле в поле со списком, я хочу удалить это имя поля из BindingSource, чтобы пользователь не мог выбрать то же имя поля для другого столбца. Остальные поля будут иметь имена полей по умолчанию, например (FirstName,Field2,LastName,Address1, Field5, Field6,Address2 и т. Д.)

Combobox это где у меня проблемы:)

Я искал фрагменты кода и добился определенного прогресса, но я мог бы воспользоваться советами кого-то, кто лучше разбирается в событиях просмотра данных и как с ними справляться. Я действительно не знаю, что я делаю, просто швыряю вещи на стену, чтобы посмотреть, не торчит ли она. Вот что я пробовал до сих пор...

InitializeComponent();
dataGridView1.EditingControlShowing += new DataGridViewEditingControlShowingEventHandler(DataGridViewEditingControlShowing);

private void DataGridViewEditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
    {
        //here we will add the combo box's selected event changed 
        ComboBox cmbBox; 
        if (dataGridView1.CurrentCell is DataGridViewComboBoxCell)
        { 
            cmbBox = e.Control as ComboBox; 
            if (cmbBox == null)
                return; 
            cmbBox.SelectedIndexChanged += cmbBox_SelectedIndexChanged; 
        }
    }

    //This will display value of Select values of Combo Box 
    //which is DataGridView
    void cmbBox_SelectedIndexChanged(object sender, EventArgs e)
    {
        ComboBox cmbBox = (ComboBox)sender;
        if (cmbBox.SelectedValue != null)
        {
            MessageBox.Show(cmbBox.SelectedValue.ToString());  //testing
            bindingSource.Remove(cmbBox.SelectedValue);   //this removes it from the current combobox as well, no good.  Also run time error when clicking into a different combobox
        }          
    }

Я надеюсь, что я достаточно описательный и выложил достаточно кода, чтобы дать всем возможным помощникам гуру кода чувство, что я пытаюсь достичь. Если вам нужна дополнительная информация, пожалуйста, дайте мне знать. Любые идеи / решения с благодарностью.

Спасибо!

1 ответ

Вы на правильном пути, но для этого, я думаю, каждому комбинированному списку потребуется свой собственный источник данных, поэтому ими можно управлять индивидуально. Если все они используют один и тот же источник, они не могут иметь разное содержимое, что вам и нужно (выбор X в выпадающем списке A должен удалить его из всех остальных выпадающих списков).

В своем цикле, в котором вы создаете комбинированные списки, "клонируйте" источник данных, чтобы у каждого из них был свой собственный.

Другие вопросы по тегам