【问题标题】:Gridview EditTemplate DropDownlistGridview EditTemplate DropDownlist
【发布时间】:2012-10-27 03:30:13
【问题描述】:

错误是 ddlgvRooms' 有一个无效的 SelectedValue,因为它不存在于项目列表中。 参数名称:值

我读到很多人对此特定问题有疑问,但没有一个修复程序适用于我的情况。我尝试了一些不同的方法,例如设置 appenddatabounditems="true" 也尝试在 itemcollection 中设置默认值空值。 我读到的大多数论坛帖子都是几年前的,我希望他们已经修复了这个错误,而我只是忽略了一些东西。

我正在尝试让我的级联下拉列表在 gridview 编辑模板字段中工作。我在详细信息视图中创建了这些,插入一切都很好。

我的设置 基本上我有一个网络方法,它有 2 个函数 getRooms 和 getJacks,它们应该从我创建的 2 个数据集中获取数据。数据集从几个 SQLSTOREDPROCEDURES 中获取数据。

我的 aspx 页面下拉列表和 AjaxCDDL 看起来像这样

  <EditItemTemplate>
                       <asp:DropDownList ID="ddlgvRooms" runat="server"
                            SelectedValue='<%# Bind("intRoom") %>'>  
                     </asp:DropDownList>                                               <asp:CascadingDropDownID="ddlgvRooms_CascadingDropDown"                 
                         runat="server"
                         Enabled="True" 
                         TargetControlID="ddlgvRooms" 
                         Category="Jack"
                         ServiceMethod = "GetRooms"
                         ServicePath = "CascadingDropDownRooms.asmx"
                         LoadingText = "[Loading Rooms...]"
                         PromptText="Please Select Room"> 
                        </asp:CascadingDropDown>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="lblgvRoom" runat="server"                      Text='<%#  Eval("intRoom") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="JackNumber" SortExpression="intJack">
                    <EditItemTemplate>
                        <asp:DropDownList ID="ddlgvJacks" runat="server"
                        Height="20px" Width="125px">

                        </asp:DropDownList>
                       <asp:CascadingDropDown ID="ddlgvJack_CascadingDropDown" 
                                            runat="server" 
                                            Enabled="True" 
                                            Category="Jack" 
                                            ServiceMethod="GetJacks" 
                                            ServicePath="CascadingDropDownRooms.asmx" 
                                            TargetControlID="ddlgvJacks" 
                                            ParentControlID="ddlgvRooms" 
                                            LoadingText="[Loading Jacks...]" 
                                            PromptValue="Please Select A Jack">
                        </asp:CascadingDropDown>

                    </EditItemTemplate>

<WebMethod()> _
    Public Function GetRooms(ByVal knownCategoryValues As String, ByVal category As String) As CascadingDropDownNameValue()
            Dim roomAdapter As New dsRoomsTableAdapters.roomlistTableAdapter()

            Dim roomValues As New List(Of CascadingDropDownNameValue)()
            For Each row As DataRow In roomAdapter.GetAllRooms()
                roomValues.Add(New CascadingDropDownNameValue(row("RoomName").ToString(), row("intRoom").ToString()))
            Next
            Return roomValues.ToArray()
        End Function

        <WebMethod()> _
        Public Function GetJacks(ByVal knownCategoryValues As String, ByVal category As String) As CascadingDropDownNameValue()
            Dim kv As StringDictionary = CascadingDropDown.ParseKnownCategoryValuesString(knownCategoryValues)

            Dim jackid As Integer
            If ((Not kv.ContainsKey("Jack")) Or (Not Int32.TryParse(kv("Jack"), jackid))) Then
                Return Nothing
            End If

            Dim jackAdapter As New dsRoomJacksTableAdapters.jacklistTableAdapter()

            Dim jackValues As New List(Of CascadingDropDownNameValue)()
            For Each row As DataRow In jackAdapter.GetJacksByRoomId(jackid)
                jackValues.Add(New CascadingDropDownNameValue(row("JackNumber").ToString(), row("intJack").ToString()))
            Next
            Return jackValues.ToArray()
        End Function

【问题讨论】:

    标签: asp.net vb.net gridview


    【解决方案1】:

    该页面可能会在填充之前尝试设置下拉列表的选定值。尝试利用 GridView.RowDataBound Event 首先填充下拉列表的选项,然后将所选值设置为行的 intRoom 值。如果 ddlgvRooms 有一个可以在运行前确定的静态选项列表,请在 aspx 页面中定义它们,然后您应该能够按照当前的方式进行操作。

    【讨论】:

    • 我尝试添加 FirstRoomSecondRoom 但仍然收到同样的错误
    【解决方案2】:

    DropDownList ddlgvRoom = (DropDownList)GridView1.Rows[e.RowIndex].FindControl("ddlgvRoom"); 字符串 strgvRoom = ddlgvRoom.SelectedItem.Text.ToString();

        DropDownList ddlgvJack = (DropDownList)
        GridView1.Rows[e.RowIndex].FindControl("ddlgvJack");
        string strgvJack = ddlgvJack.SelectedItem.Text.ToString();
    
        DropDownList ddlgvVlan = (DropDownList)
        GridView1.Rows[e.RowIndex].FindControl("ddlgvVlan");
        string strgvVlan = ddlgvVlan.SelectedItem.Text.ToString();
    

    【讨论】:

      【解决方案3】:

      这里有两个可能的问题:

      1. 在您设置 SelectedValue 时,DropDownList 尚未填充;
      2. 您尚未设置 DataTextField 和 DataValueField 属性

      在标记中:

      <asp:DropDownList ID="DropDownList1" runat="server" DataTextField="TextColumn" DataValueField="ValueColumn" SelectedValue='<%# Eval("SelectedValueColumn") %>' ...>
      

      在 OnRowDataBound 事件中:

      protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
      {
          DropDownList selectList = e.Row.FindControl("DropDownList1") as DropDownList;
          if (selectList != null)
          {
              selectList.DataSource = SomeDataSource; //your datasource
              selectList.DataBind();
          }
      }
      

      【讨论】:

      • 感谢您的回复,我可以问一下,因为我有 2 个函数,我认为应该通过 ajax 扩展器填充我的下拉列表,为什么我必须重新填充下拉列表会与我的函数冲突填充相同的下拉列表?我在顶部添加了我的 2 个函数
      • 您好 James 在对这个问题进行了大量研究之后。我认为我需要做的是将值从该字段上的标签控件传递到下拉列表。如果我执行 DataSource='' 并取出 selectedvalue,则下拉列表在 gridview 中效果很好,但它不会保留该记录中的值。有没有办法将标签中的值传递给下拉列表?
      【解决方案4】:

      这对我有用。填充 GridView 时,应在 RowDataBound 事件中填充每个 DropDownList:

      protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
          {
              numberFormatDA formatDA = new numberFormatDA();
      
              DataTable mytable = new DataTable();
              DataColumn formatIDcolumn = new DataColumn("fkNumberFormat");
              DataColumn formatNameColumn = new DataColumn("numberFormat");
      
              mytable.Columns.Add(formatIDcolumn);
              mytable.Columns.Add(formatNameColumn);
      
              DataSet ds = new DataSet();
              ds = formatDA.getNumberFormatsDS();
      
              if ((e.Row.RowState & DataControlRowState.Edit) > 0)
              {
                  TextBox txtSite = (TextBox)e.Row.FindControl("txtIDSite");
      
                  DropDownList ddl = (DropDownList)e.Row.FindControl("ddlNumberFormat");
                  DataRow[] rows = ds.Tables[0].Select();
      
                  foreach (DataRow row in rows)
                  {
                      DataRow newrow = mytable.NewRow();
                      newrow["fkNumberFormat"] = row["idnumberFormat"];
                      newrow["numberFormat"] = row["numberFormat"];
                      mytable.Rows.Add(newrow);
                  }
      
                  ddl.DataSource = mytable;
                  ddl.DataTextField = "numberFormat";
                  ddl.DataValueField = "fkNumberFormat";
      
                  int numberFormatID = 0;
                  Label lblFormatID = (Label)e.Row.FindControl("numberFormatLabel");
                  numberFormatID = Int32.Parse(lblFormatID.Text);
      
                  ddl.SelectedValue = numberFormatID.ToString();
                  ddl.DataBind();
              }
          }
      

      希望这会有所帮助!

      【讨论】:

      • 感谢您的回复,但是我认为这是在 csharp 中,我正在使用 VB,我也有级联下拉列表,其中已经填充了数据集,这是我试图重用的,所以我的代码不是那么混乱.
      【解决方案5】:

      对于您的问题,我有一个非常简单的解决方案。

      <asp:DropDownList ID="ddlgvRooms" runat="server" SelectedValue='<%# Bind("intRoom") %>'> <asp:ListItem Value="1">FirstRoom</asp:ListItem> 
      <asp:ListItem Value="2">SecondRoom</asp:ListItem> 
      </asp:DropDownList>  
      

      上面的代码会给你一个错误。而不是SelectedValue = '&lt;%# Bind("intRoom") %&gt;' 改成SelectedValue = '&lt;%# Eval("intRoom") %&gt;'

      这确实有效。

      【讨论】:

        猜你喜欢
        • 2011-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-13
        • 2016-10-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多