当字符串/对象列表绑定到数据源时,C#下拉选择项为null

本文关键字:选择 null 对象 字符串 列表 绑定 数据源 | 更新日期: 2023-09-27 18:15:50

我正在尝试将字符串列表绑定到Dropdown。在前端,我可以正确地看到下拉列表,但当我选择一个值并点击搜索时,它会抛出一个空引用异常,因为它看起来像是只读的。这就是我尝试的:

<asp:DropDownList runat="server" ID="ddl"  AppendDataBoundItems="True">
<asp:ListItem Value="">Please Select</asp:ListItem></asp:DropDownList>

代码背后:

List<string> items = helper.GetData(); //A method that simply returns a list of strings.
ddl.DataSource = items;
ddl.DataBind();
protected void searchClick(object sender, EventArgs e){
/*This is null and when I inspect this, I don't see any value matching 
the string selected in dropdown.*/
var selectedOption = ddl.SelectedItem.Text;  
}

我在网上尝试了所有可能的解决方案。我甚至试着把它转换成字典,就像这里给出的一样。我还尝试将它转换为一个对象,为它分配一个标题和一个ID属性,如所示

谢谢。

当字符串/对象列表绑定到数据源时,C#下拉选择项为null

您在dropdownlist中有绑定列表,但在选择任何值时都没有附加必须提取的值。

If(!isPostBack())
{
ddl.DataSource = items;
ddl.DataTextField = "Field name which hold items(Text to be shown in ddl)";
ddl.DataValueField = "ID of items(Value for items)";
ddl.DataBind();
}

如果只有列表并且必须附加在下拉列表中,则使用bleow代码。

List<string> items=helper.GetData();
for(var i=0; i < items.Count; i++)
{
    ddl.Items.Add(new ListItem(i, items[i]));
    //ddl.Items.Add(new ListItem(key, source)); For reference only
}

要获得价值,您可以使用:

ddl.SelectedItem.Value;
ddl.SelectedItem.Text;

看了看,我注意到两件事:

  1. 如果前4行在页面加载中,请确保将它们包装在中

    if(!isPostBack({

    }

如果它没有被包裹在!isPostBack则每次回发时,该值都将默认为第一个值,因为ddl每次都会反弹。

  1. 如上所述,您没有指定DataTextField或DataValueField。如果未指定这些,则会在下拉列表中获得对象类型,而不是值

此外,请考虑使用ddl。SelectedValue而不是SelectedItem。这样的文本将为您提供分配给DataValueField 的唯一ID

 Dictionary<string, string> openWith = 
        new Dictionary<string, string>(); 

根据列表,您需要使用以下下拉

ddl.DataSource = items;
ddl.DataTextField = "Text Which Show In DropDown";
ddl.DataValueField = "value -When Text Is Select From Dropdown";
ddl.DataBind();