绑定 DropDownList 到 DetailsView 中。

3

我在尝试从数据库中填充一个下拉列表时遇到了问题。当我尝试设置数据源时,我找不到下拉控件,因为它在DetailsView中,我认为这可能与它仅在编辑模式下创建有关。但是当我正在编辑时,它仍然显示为当前模式,所以不确定发生了什么。

以下是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();
    }
}

你的代码示例中的方法存在于哪个代码后台? - Matthew Jones
2个回答

3
如果还没有这样做,请将代码示例放置在DetailsView1_ModeChanged或DetailsView1_DataBound方法中。如果它在DetailsView1_ModeChanging方法中,则模式实际上尚未更改。
另外,请确保按以下方式设置DataTextField和DataValueField:
DropDownList1.DataTextField = "TextFieldName";
DropDownList1.DataValueField = "ValueFieldName";

同时删除SelectedValue绑定;它除了会引发错误之外没有任何作用。

编辑2:如果你确实需要在首次数据绑定时选择下拉列表的特定值,可以像这样操作:

if(DropDownList1.Items.Contains(DropDownList1.Items.FindByValue("Value")))
{
    DropDownList1.SelectedIndex = DropDownList1.Items.IndexOf(DropDownList1.Items.FindByValue("Value));
}

我尝试将它放在DetailsView_DataBound方法中,但我的SelectedValue会抛出一个错误,但如果我删除它,列表就会被填充。虽然只有System.Collections.ArrayList而不是我想要的值,所以我猜我需要以某种方式设置文本和值属性! :) 我会尝试设置它们,然后再次使用SelectedValue进行测试。 - annelie
谢谢,我会尝试的!我有一个ArrayList的ArrayList,所以只需要先更改一下。然后希望它能正常工作! :) - annelie
好的,非常感谢,运行良好!由于某种原因,在更新时它没有发布值,因此它被设置为null,但这是另一个故事了。如果我自己无法解决它,可能会发布另一个问题。 :) - annelie

2

尝试在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"


谢谢,这确实找到了控件,但是在ddlRegions.DataBind()上失败了,抛出错误“Databinding方法(如Eval()、XPath()和Bind())只能在数据绑定控件的上下文中使用。”。 - annelie
使用 DataBinder.Eval(Container.DataItem,"region_name") 方法代替 Eval("region_name")。 - Glennular

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接