【问题标题】:Binding a DropDownList inside a DetailsView在 DetailsView 中绑定 DropDownList
【发布时间】:2010-04-23 15:58:10
【问题描述】:

我在尝试从数据库中填充下拉列表时遇到问题。当我尝试设置数据源时,我找不到下拉控件,它位于 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();
    }
}

【问题讨论】:

  • 后面代码中的示例存在于什么方法中?

标签: c# .net drop-down-menu .net-2.0 detailsview


【解决方案1】:

如果还没有,请将代码中的示例放在 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 再次测试它。
  • 谢谢,我会试试的!我有一个数组列表的数组列表,所以只需要先更改它。然后是应该有希望的工作! :)
  • 好的,工作正常,非常感谢!出于某种原因,当我进行更新时它没有发布值,所以它被设置为 null,但我猜这是一个完全不同的故事。如果我自己不整理,可能会发布另一个问题。 :)
【解决方案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() 上失败并抛出错误“Eval()、XPath() 和 Bind() 等数据绑定方法只能用于数据绑定控件的上下文。”。
  • 使用 DataBinder.Eval(Container.DataItem,"region_name") 方法代替 Eval(“region_name”)
猜你喜欢
  • 2011-03-26
  • 2015-10-27
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多