проблема с заполнением зависимых выпадающих списков

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

typeName - typeNo - pattern - variant
R - 125 - 254978 - 1
R - 125 - 254979 - 1
R - 125 - 254979 - 2
Ri- 54 - 54658 - 1
Ri- 54 - 54658 - 2... etc.

Я заполняю typeNameCombobox в formLoad после того, как typeNoCombobox заполняет событие typeNameCombobox_SelectedIndexChanged(), и, как этот шаблон, Combobox заполняет событие typeNoCombobox_SelectedIndexChanged()...

но есть проблема в typeNameCombobox_SelectedIndexChanged(), в сообщении об ошибке говорится, что:

Не удалось связать составной идентификатор "System.Data.DataRowView".

и использовать этот абсурдный метод

if (typeNameCombobox .SelectedValue.ToString() != "System.Data.DataRowView")
{
 fill -> typeNoCombobox
}

хотя эти четыре поля со списком являются зависимыми, поля со списком ниже не заполняются при первой загрузке.

и я использую второй абсурдный метод

typeName.selectedIndex = 1;
typeName.selectedIndex = 0;
typeName.selectedIndex = 1;
typeName.selectedIndex = 0; 

(Мне нужно сделать это минимум 4 раза, потому что есть четыре зависимых поля со списком)

после заполнения всех полей со списком нет проблем, если пользователь меняет typeName, все зависимые значения меняются

есть ли способ сделать этот код понятным?

редактировать после ответа:

tipTur=typename tip = typeNo desen = вариант шаблона = вариант

вот мой исходный код

 ConnectionClassOleDb cc = new ConnectionClassOleDb();


    private void SiparisDetay_Load(object sender, EventArgs e) //formload
        {            

            sorgu = "Select distinct tipTurId, tipTur from View_Tip order by tipTur";
            cc.cbDoldur(sorgu, cbTipTur, "tipTur", "tipTurId"); 

            cbTipTur.SelectedIndex = 1;
            cbTipTur.SelectedIndex = 0;
            cbTipTur.SelectedIndex = 1;
            cbTipTur.SelectedIndex = 0;       

        }



    private void cbTipTur_SelectedIndexChanged(object sender, EventArgs e) 
        {
            if (cbTipTur.SelectedValue.ToString() != "System.Data.DataRowView")
            {
                string sorgu = "SELECT distinct tipNo FROM tblTip where " +
                    " tipTurId = '" + cbTipTur.SelectedValue.ToString() + "' ORDER BY tipNo";
                cc.cbDoldur(sorgu, cbTip, "tipNo", "tipNo");

            }
        }

        private void cbTip_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cbTip.SelectedValue.ToString() != "System.Data.DataRowView")
            {
                string sorgu = "SELECT desen FROM tblTip WHERE " +
                    " tipTurId = '" + cbTipTur.SelectedValue.ToString() +
                    "' AND tipNo = '" + cbTip.SelectedValue.ToString() + "' order by desen";
                cc.cbDoldur(sorgu, cbDesen, "desen", "desen");
            }
        }

        private void cbDesen_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cbDesen.SelectedValue.ToString() != "System.Data.DataRowView")
            {
                string sorgu = "SELECT varyant FROM tblTip WHERE " +
                               " desen = '" + cbDesen.SelectedValue.ToString() +
                               "' AND tipTurId = '" + cbTipTur.SelectedValue.ToString() +
                               "' AND tipNo = '" + cbTip.SelectedValue.ToString() + "' ORDER BY varyant";
                cc.cbDoldur(sorgu, cbVaryant, "varyant", "varyant");
            }
        }

и коды в connectionclass следующим образом:

public void cbDoldur(string sorgu, ComboBox cb, string text, string value) //fill combobox
        {        
            DataTable dtDdl = Dt(sorgu);
            cb.DataSource = dtDdl;
            cb.DisplayMember = text;
            cb.ValueMember = value;            

            if (cb.Items.Count > 0)
            {
                cb.SelectedIndex = 0;
            }

        }


 public DataTable Dt(string query)
        {

            DataTable dt = new DataTable();
            if (Open())
            {
                OleDbDataAdapter da = new OleDbDataAdapter(query, connection);
                try
                {
                    da.Fill(dt);

                }
                catch (Exception ex)
                {
                    MessageBox.Show("Sistem Mesajı:" + ex.Message, "Hata", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            //connection.Close();
            return dt;
        }

person Rapunzo    schedule 27.06.2011    source источник
comment
Можете ли вы показать код, я думаю, что вы неправильно привязываетесь к зависимым запросам   -  person V4Vendetta    schedule 27.06.2011
comment
Хорошо, я добавляю исходный код, который я использую   -  person Rapunzo    schedule 27.06.2011
comment
Как насчет того, чтобы изменить distinct tipNo as tipNo, добавить псевдоним, а также distinct tipTurId as tipTurId   -  person V4Vendetta    schedule 27.06.2011


Ответы (2)


Вы должны попробовать добавить псевдоним к именам полей в запросе для

Select distinct tipTurId, tipTur from View_Tip

To

Select distinct tipTurId as tipTurId , tipTur from View_Tip

А также в этом случае SELECT distinct tipNo FROM tblTip к

SELECT distinct tipNo as tipNo FROM tblTip

потому что он не сможет найти поля в DataSource как tipTurId, так как он будет возвращен с Distinct , то же самое и с tipNo

person V4Vendetta    schedule 27.06.2011
comment
нет, не сработало, и я посмотрел на визуализатор набора данных, и там есть имена полей, которые вы можете посмотреть ссылка - person Rapunzo; 27.06.2011

Я решаю свою проблему, изменяя мою функцию comboboxpopulate в классе, подобном этому

cb.DisplayMember = text;
cb.ValueMember = value;
cb.DataSource = dtDdl;  
person Rapunzo    schedule 28.06.2011