การเชื่อมโยง DropDownList ภายใน DetailView

ฉันประสบปัญหาในการพยายามเติมรายการดรอปดาวน์จากฐานข้อมูล เมื่อฉันพยายามตั้งค่าแหล่งข้อมูล ฉันไม่พบตัวควบคุมแบบเลื่อนลง มันอยู่ใน DetailView ดังนั้นฉันคิดว่าอาจมีบางอย่างที่เกี่ยวข้องกับมันที่ถูกสร้างขึ้นเมื่ออยู่ในโหมดแก้ไขเท่านั้น ตอนที่ฉันกำลังแก้ไข มันยังบอกว่าอยู่ในโหมดปัจจุบัน เลยไม่แน่ใจว่าเกิดอะไรขึ้น

นี่คือรหัสจากไฟล์ aspx:

<asp:DetailsView id="DetailsView1" runat="server" AutoGenerateRows="false" DataSourceID="myMySqlDataSrc"  DataKeyNames="id" AutoGenerateDeleteButton="True" AutoGenerateEditButton="True" AutoGenerateInsertButton="False" >
     <Fields>
        <asp:TemplateField HeaderText="Region">
            <ItemTemplate><%# Eval("region_name") %></ItemTemplate>
            <EditItemTemplate>
                <asp:DropDownList ID="RegionDropdownList" runat="server" SelectedValue='<%# Bind("region_id")%>' />
            </EditItemTemplate>
        </asp:TemplateField>        
     </Fields>
</asp:DetailsView>

และนี่คือจากโค้ดด้านหลัง:

ArrayList regionsList = BPBusiness.getRegions();
if (DetailsView1.CurrentMode == DetailsViewMode.Edit)
{
    DropDownList ddlRegions = (DropDownList)DetailsView1.FindControl("RegionDropdownList");
    if (ddlRegions != null)
    {
        ddlRegions.DataSource = regionsList;
        ddlRegions.DataBind();
    }
}

person annelie    schedule 23.04.2010    source แหล่งที่มา
comment
ตัวอย่างของคุณจากโค้ดด้านหลังมีอยู่ในวิธีใด   -  person Matthew Jones    schedule 23.04.2010


คำตอบ (2)


หากยังไม่ได้เป็นเช่นนั้น ให้วางตัวอย่างจากโค้ดของคุณไว้ด้านหลังภายในเมธอด DetailView1_ModeChanged หรือ DetailView1_DataBound ถ้าอยู่ในเมธอด DetailView1_ModeChanging แสดงว่าโหมดนั้นยังไม่เปลี่ยนจริงๆ

แก้ไข: นอกจากนี้ ตรวจสอบให้แน่ใจว่าคุณได้ตั้งค่า DataTextField และ DataValueField ดังนี้:

DropDownList1.DataTextField = "TextFieldName";
DropDownList1.DataValueField = "ValueFieldName";

ลบการผูก SelectedValue ด้วย มันไม่ทำอะไรเลยนอกจากเกิดข้อผิดพลาด

แก้ไข 2: หากคุณต้องการเลือกค่าเฉพาะของรายการแบบเลื่อนลงเมื่อเป็น databind เป็นครั้งแรก คุณสามารถดำเนินการดังนี้:

if(DropDownList1.Items.Contains(DropDownList1.Items.FindByValue("Value")))
{
    DropDownList1.SelectedIndex = DropDownList1.Items.IndexOf(DropDownList1.Items.FindByValue("Value));
}
person Matthew Jones    schedule 23.04.2010
comment
ฉันพยายามวางไว้ในเมธอด DetailView_DataBound มันจะเกิดข้อผิดพลาดกับ SelectedValue ของฉัน แต่ถ้าฉันลบรายการนั้นออกไป แม้ว่าจะมีเฉพาะกับ System.Collections.ArrayList แทนที่จะเป็นค่าที่ฉันต้องการ ดังนั้นฉันเดาว่าฉันต้องตั้งค่าคุณสมบัติข้อความและค่าด้วยวิธีใดวิธีหนึ่ง! :) ฉันจะลองตั้งค่าเหล่านั้นแล้วทดสอบอีกครั้งโดยใช้ SelectedValue ในนั้น - person annelie; 23.04.2010
comment
ขอบคุณ ฉันจะลอง! ฉันมี arraylist ของ arraylist ดังนั้นเพียงแค่ต้องเปลี่ยนสิ่งนั้นก่อน หวังว่าคงจะได้ผล! :) - person annelie; 23.04.2010
comment
ถูกต้อง ทำงานได้ดี ขอบคุณมาก! ด้วยเหตุผลบางอย่าง มันไม่โพสต์ค่าเมื่อฉันทำการอัปเดต ดังนั้นมันจึงได้รับการตั้งค่าเป็นโมฆะ แต่นั่นเป็นเรื่องราวที่แตกต่างไปจากเดิมอย่างสิ้นเชิง อาจโพสต์คำถามอื่นถ้าฉันไม่แยกแยะเอง :) - person annelie; 23.04.2010

ลองทำในวิธี itemcreated

protected void DetailsView1_ItemCreated(object sender, EventArgs e)
{
    ArrayList regionsList = BPBusiness.getRegions();
    if (DetailsView1.CurrentMode == DetailsViewMode.Edit)
    {
        DropDownList ddlRegions = (DropDownList)DetailsView1.FindControl("RegionDropdownList");
        if (ddlRegions != null)
        {
            ddlRegions.DataSource = regionsList;
            ddlRegions.DataBind();
        }
    }
}

อย่าลืมตั้งค่า OnItemCreated="DetailsView1_ItemCreated"

person Glennular    schedule 23.04.2010
comment
ขอบคุณ สิ่งนี้พบการควบคุม อย่างไรก็ตาม มันล้มเหลวใน ddlRegions.DataBind() ทำให้เกิดข้อผิดพลาด วิธีการ Databinding เช่น Eval(), XPath() และ Bind() สามารถใช้ได้เฉพาะในบริบทของการควบคุม databound เท่านั้น - person annelie; 23.04.2010
comment
ใช้วิธี DataBinder.Eval(Container.DataItem,region_name) แทน Eval("region_name") - person Glennular; 23.04.2010