B-Koronfol Ответов: 1

Как фильтровать данные в datagirdviewcombobox на основе другого datagirdviewcombobox


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

Что я уже пробовал:

public partial class Form1 : Form
{
    DataGridViewComboBoxColumn column;
    DataTable dataTable1 = new DataTable("Country1");
    DataTable dataTable2 = new DataTable("Country2");
    public Form1()
    {
        InitializeComponent();
        column = new DataGridViewComboBoxColumn();

        dataTable1.Columns.Add("Code", typeof(String));
        dataTable1.Columns.Add("Cities", typeof(String));

        dataTable1.Rows.Add("1", "City1 of country1");
        dataTable1.Rows.Add("11", "City2 of country1");
        dataTable1.Rows.Add("111", "City3 of country1");

        dataTable2.Columns.Add("Code", typeof(String));
        dataTable2.Columns.Add("Cities", typeof(String));

        dataTable2.Rows.Add("2", "City1 of country2");
        dataTable2.Rows.Add("22", "City2 of country2");
        dataTable2.Rows.Add("222", "City3 of country2");

        dataGridView1.Columns.Add(column);

        column.DataSource = dataTable1;
        column.ValueMember = "Code";
        column.DisplayMember = "Cities";
    }
    private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
    {
        if(e.ColumnIndex==0)
        {
            if(dataGridView1.CurrentCell.Value.ToString()== "Country1")
            {
                column.DataSource = dataTable1;
            }
            else if(dataGridView1.CurrentCell.Value.ToString() == "Country2")
            {
                column.DataSource = dataTable2;
            }
        }
    }
    private void dataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e)
    {
    }

}

Gerry Schmitz

Я не вижу никакого кода, связанного с вашей "проблемой"; вы хотите, чтобы кто-то написал его для вас.

B-Koronfol

Если вы можете предоставить некоторую информацию! Предоставьте его, но, если вы не можете! вы можете проигнорировать вопрос без сплетен.

1 Ответов

Рейтинг:
9

B-Koronfol

I got the information, using the DataGridViewComboBoxCell.DataSource instade of DataGridViewComboBoxColumn.DataSource will solve the problem.


public partial class Form1 : Form
    {
        DataGridViewComboBoxColumn column;
        DataGridViewComboBoxCell cell;
        DataTable dataTable1 = new DataTable("Syria");
        DataTable dataTable2 = new DataTable("Yemen");
        public Form1()
        {
            InitializeComponent();
            column = new DataGridViewComboBoxColumn();

            dataTable1.Columns.Add("Code", typeof(String));
            dataTable1.Columns.Add("Cities", typeof(String));

            dataTable1.Rows.Add("1", "Damascus");
            dataTable1.Rows.Add("11", "Azaz");
            dataTable1.Rows.Add("111", "Aleppo");

            dataTable2.Columns.Add("Code", typeof(String));
            dataTable2.Columns.Add("Cities", typeof(String));

            dataTable2.Rows.Add("2", "Sanaa");
            dataTable2.Rows.Add("22", "Aden");

            dataGridView1.Columns.Add(column);

            cell = (DataGridViewComboBoxCell)dataGridView1.Rows[0].Cells[1];

            cell.DataSource = dataTable1;
            cell.ValueMember = "Code";
            cell.DisplayMember = "Cities";

            column.CellTemplate = cell;


        }
        private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            cell =(DataGridViewComboBoxCell) dataGridView1.Rows[e.RowIndex].Cells[column.Name.ToString()];
            if (e.ColumnIndex==0)
            {
                if(dataGridView1.CurrentCell.Value.ToString()== "Syria")
                {

                    cell.DataSource = dataTable1;
                }
                else if(dataGridView1.CurrentCell.Value.ToString() == "Yemen")
                {
                    cell.DataSource = dataTable2;
                }
            }
        }
    }
}