Как отфильтровать списки со списком в других списках? - PullRequest
0 голосов
/ 23 мая 2019

У меня есть 3 таблицы:

1) Дом:

| ID_house | House_names | num_region |
---------------------------------------
|   int    |    names    |    int     |

num_region - внешний ключ, равный первичному ключу (Region.ID_region) в таблице регионов.

2) Регион:

| ID_region | Region_names | num_area |
---------------------------------------
|   int     |    names     |   int    |

num_area - внешний ключ, равный первичному ключу (Areas_InRegion.ID_area) в таблице Areas_InRegion.

3) Areas_InRegion:

| ID_area | Area_names |
------------------------
|   int   |    names   |

В форме у меня есть 3 комбинированных списка:

1) cmbHouse - для отображения названий домов из таблицы House.

2) cmbRegion - для отображения названий регионов из таблицы регионов.

3) cmbArea - для отображения названий областей в регионах из таблицы Areas_InRegion.

Я заполняю эти комбо как:

        //cmbHouse
        string cmbHouse_query = "SELECT * FROM House";
        OleDbDataAdapter dahouse = new OleDbDataAdapter(cmbHouse_query, connection);
        DataTable tablehouse = new DataTable();
        dahouse.Fill(tablehouse);
        cmbHouse.DataSource = tablehouse;
        cmbHouse.DisplayMember = "House_names"; 
        cmbHouse.ValueMember = "House.num_region";
        cmbHouse.SelectedIndex = -1;

        //cmbRegion
        string cmbRegion_query = "SELECT * FROM Region";
        OleDbDataAdapter daregion = new OleDbDataAdapter(cmbRegion_query, connection);
        DataTable tableregion = new DataTable();
        daregion.Fill(tableregion);
        cmbRegion.DataSource = tableregion;
        cmbRegion.DisplayMember = "Nameofregions";
        cmbRegion.ValueMember = "Region.ID_region";
        cmbRegion.SelectedIndex = -1;

        //cmbArea
        string cmbArea_query = "SELECT * FROM Areas_InRegion";
        OleDbDataAdapter daArea = new OleDbDataAdapter(cmbArea_query, connection);
        DataTable tablearea = new DataTable();
        daArea.Fill(tablearea);
        cmbArea.DataSource = tablearea;
        cmbArea.DisplayMember = "Names_OfAreas";
        cmbArea.ValueMember = "Areas_InRegion.ID_areas";
        cmbArea.SelectedIndex = -1;

Я могу отфильтровать комбо cmbRegion по выделению в комбо cmbHouse:

    private void cmbHouse_SelectionChangeCommitted(object sender, EventArgs e)
    {
        if (cmbHouse.SelectedIndex != null)
        {
            int num_region = Convert.ToInt32(cmbHouse.SelectedValue);
            OleDbCommand com = new OleDbCommand();
            com.CommandText = "SELECT * FROM Region WHERE Region.ID_region=" + num_region.ToString() + "";
            com.Parameters.AddWithValue("House.num_region", typeof(int));
            OleDbDataAdapter danum_region = new OleDbDataAdapter(com.CommandText, connection);
            DataTable tablenum_region = new DataTable();
            danum_region.Fill(tablenum_region);
            cmbRegion.DataSource = tablenum_region;
            cmbRegion.DisplayMember = "Nameofregions";
            cmbRegion.ValueMember = "Region.ID_region";
            cmbRegion.SelectedIndex = -1;    
        }  
    }

Но когда я пытаюсь отфильтровать код cmbRegion в фильтре комбо cmbArea, я получаю сообщение об ошибке «Не задано значение для одного или нескольких обязательных параметров». здесь:

    private void cmbRegion_SelectionChangeCommitted(object sender, EventArgs e)
    {            
        int num_area = Convert.ToInt32(cmbRegion.SelectedValue);
        OleDbCommand com2 = new OleDbCommand();
        com2.CommandText = "SELECT * FROM Areas_InRegion WHERE Region.num_arearegion=" + num_area.ToString() + "";
        com2.Parameters.AddWithValue("Region.num_arearegion", typeof(int));
        OleDbDataAdapter danum_area = new OleDbDataAdapter(com2.CommandText, connection);
        DataTable tablenum_area = new DataTable();
        danum_area.Fill(tablenum_area); //Error 'No value given for one or more required parameters.' appears here
        cmbArea.DataSource = tablenum_area;
        cmbArea.DisplayMember = "Names_OfAreas";
        cmbArea.ValueMember = "Areas_InRegion.ID_areas";
        cmbArea.SelectedIndex = -1;
    }

Помогите мне решить эту проблему. Спасибо за помощь.

...