【问题标题】:'ddlItem' has a SelectedValue which is invalid because it does not exist in the list of items. Parameter name: value“ddlItem”有一个无效的 SelectedValue,因为它不存在于项目列表中。参数名称:值
【发布时间】:2015-03-16 07:13:00
【问题描述】:

每当我尝试在 gridview 下拉列表中绑定数据时都会收到此错误。

这是aspx代码:

<asp:TemplateField HeaderText="Item Description"  SortExpression="ddlItem">
       <ItemTemplate>
         <asp:DropDownList ID="ddlItem" runat="server" Height="25px" Width="200px" SelectedValue='<%# Eval("ddlItem") %>'>
         </asp:DropDownList>
       </ItemTemplate>
    </asp:TemplateField>

下面是 (c#) 的代码:

        private void SetInitialRowToGrid()
            {
                // Initialize and Set initial row of Datatable
                var tempDataTable = new DataTable();
                tempDataTable.Columns.Add("lblId");
                tempDataTable.Columns.Add("ddlItem");
                tempDataTable.Columns.Add("txtUnit");
                tempDataTable.Columns.Add("txtQty");
                tempDataTable.Rows.Add("1", "", "", "");

                // Store that datatable into viewstate
                ViewState["TempTable"] = tempDataTable;

                // Attach Gridview Datasource to datatable        
                gvItemList.DataSource = tempDataTable;
                gvItemList.DataBind(); //Here I'm getting the error.
            }

    protected void gvItemList_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                DropDownList ddlItem = (e.Row.FindControl("ddlItem") as DropDownList);
                Jilu1TableAdapters.tbl_ItemTableAdapter item;
                item = new Jilu1TableAdapters.tbl_ItemTableAdapter();
                DataTable dt = new DataTable();
                dt = item.GetItems();

                ddlItem.DataSource = dt;
                ddlItem.DataTextField = "Item";
                ddlItem.DataValueField = "Item";
                ddlItem.DataBind();
                ddlItem.Items.Insert(0, new System.Web.UI.WebControls.ListItem("--Select an Item--", "0"));
            }
        }

protected void ddlSiteID_SelectedIndexChanged(object sender, EventArgs e)
    {
        Jilu1TableAdapters.tbl_Jr_BOMTableAdapter ds;
        ds = new Jilu1TableAdapters.tbl_Jr_BOMTableAdapter();

        DataTable dt = new DataTable();
        dt = ds.GetVersion(ddlSiteID.SelectedValue);

        ddlVersion.DataSource = dt;
        ddlVersion.DataValueField = "Version";
        ddlVersion.DataTextField = "Version";
        ddlVersion.DataBind();

        int ver = Convert.ToInt32(ddlVersion.Text);
        DataTable dt1 = new DataTable();

        dt1 = ds.GetDetails(ddlSiteID.SelectedValue, ver);

        foreach (DataRow row in dt1.Rows)
        {
            txtSiteName.Text = (row["txtSiteName"].ToString());
            ddlSiteType.Text = (row["ddlSiteType"].ToString());
            txtNoBTS.Text = (row["txtNoBTS"].ToString());
            txtNoLinks.Text = (row["txtNoLinks"].ToString());
            txtLoadBand.Text = (row["txtLoadBand"].ToString());
            ddlEBAvailability.Text = (row["ddlEBAvailability"].ToString());
            txtEBPhase.Text = (row["txtEBPhase"].ToString());
            txtDGCapacity.Text = (row["txtDGCapacity"].ToString());
            txtDGPhase.Text = (row["txtDGPhase"].ToString());            
        }
        gvItemList.DataSource = dt1;
        gvItemList.DataBind();
    }

我尝试输入Text = 'Bind("ddlItem")', Datasourse, SelectedValue,但仍然没有成功。

任何帮助将不胜感激。

【问题讨论】:

  • 如果您的数据源是字符串,那么您需要设置 DataTextField 和 DataValueField(您要绑定的对象的属性)。并检查绑定代码是否在 Page_Load postback 或 !IIPostBack
  • 绑定到下拉列表的数据是一个字符串。
  • 学习如何在遇到问题时提出问题-> 像我没有运气这样的解释是不准确的。调试您的问题,看看会发生什么。
  • @mybirthname 我的意思是说,我仍然遇到同样的错误。正如我上面提到的。

标签: c# asp.net gridview


【解决方案1】:

在这段代码中,

 <asp:DropDownList ID="ddlItem" runat="server" Height="25px" Width="200px"  
 SelectedValue='<%# Eval("ddlItem") %>'>
 </asp:DropDownList>

您将SelectedValue 设置为'&lt;%# Eval("ddlItem") %&gt;',但您的数据源字段中不存在ddlItem

将要显示的正确字段放入下拉列表中。
我建议你设置你的 DropDownList 的 DataTextFieldDataValueField
设置为DataTextField="ddlItem" DataValueField="ddlItem" .
希望对你有帮助:)

【讨论】:

  • 其实我第一次尝试在页面加载时设置一个初始行。之后,当用户输入一个 id 时,来自数据库的数据将填充到 gridview 上。这就是整个想法。
  • 添加DataTextField="ddlItem" DataValueField="ddlItem"后会发生什么?
  • 感谢您的回复。我尝试了你建议的方式,但仍然有同样的错误。 :(
【解决方案2】:

你的方法不对

试试下面的方法

protected void gvItemList_RowDataBound(object sender, GridViewEditEventArgs e)
    {
     if (e.Row.RowType == DataControlRowType.DataRow)
      {
            if ((e.Row.RowState & DataControlRowState.Edit) > 0)
            {
              DropDownList ddList= (DropDownList)e.Row.FindControl("ddlItem");
              //bind dropdownlist
              DataTable dt = con.GetData("select * from tablename");//selected data from db or  anywhere for bind ddl
              ddList.DataSource = dt;
              ddList.DataTextField = "YourCOLName";//id
              ddList.DataValueField = "YourCOLName";//displaying name
              ddList.DataBind();

              DataRowView dr = e.Row.DataItem as DataRowView;                 
              ddList.SelectedValue = dr["YourCOLName"].ToString();// default selected value
            }
       }
    }

【讨论】:

  • 为什么在下拉列表中需要SelectedValue='&lt;%# Eval("ddlItem") %&gt;'
  • 请删除下拉列表中的SelectedValue='&lt;%# Eval("ddlItem") %&gt;',然后您的代码应该可以正常工作了
  • 看,这个网格的整个想法是,首先当页面加载发生时,网格视图中会有一个空白行,即“SetInitialRowToGrid()”。当用户选择一个 id 时会发生回发,此时来自数据库的数据需要填充到 gridview 上。希望你现在明白了。
猜你喜欢
  • 2015-11-02
  • 2013-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多