ปัญหาเกี่ยวกับการเติมคอมโบบ็อกซ์ที่ต้องพึ่งพา

ฉันมีแบบฟอร์ม windows และผู้ใช้เลือกพารามิเตอร์ผ้าจากคอมโบบ็อกซ์เช่นวิธีประเทศ-รัฐ-เมือง และพารามิเตอร์ของฉันคือ:

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() และชอบ patternCombobox นี้กรอกในเหตุการณ์ 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");
            }
        }

และรหัสในคลาสการเชื่อมต่อดังนี้:

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
ไม่ ไม่ทำงานและฉันดูที่ Visualizer ชุดข้อมูลแล้ว และมีชื่อช่องต่างๆ ที่คุณสามารถดูได้ ลิงก์ - person Rapunzo; 27.06.2011

ฉันแก้ไขปัญหาโดยเปลี่ยนฟังก์ชัน comboboxpopulate ในคลาสเช่นนี้

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