Gridview EditTemplate DropDownlist

时间:2011-09-14 15:03:32

标签: asp.net vb.net gridview

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

我读过很多人遇到这个特殊问题的问题,但没有修复工作适用于我的情况。我尝试了一些不同的东西,比如设置appenddatabounditems =“true”也尝试在itemcollection中设置默认值空值。 我读过的大多数论坛都是在几年前发布的,我希望他们已经修复了这个bug,我只是忽略了一些东西。

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

MySetup 基本上我有一个webmethod,它有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

5 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

DropDownList ddlgvRoom =(DropDownList)GridView1.Rows [e.RowIndex] .FindControl(“ddlgvRoom”);         string 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();

答案 2 :(得分:0)

这里有两个可能的问题:

  1. 您在设置SelectedValue时尚未填充DropDownList;
  2. 您尚未设置DataTextField和DataValueField属性
  3. 在标记中:

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

答案 3 :(得分:0)

这对我有用。在填充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();
        }
    }

希望这有帮助!

答案 4 :(得分:0)

我的解决方案非常简单。

<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 = '<%# Bind("intRoom") %>' 将其更改为SelectedValue = '<%# Eval("intRoom") %>'

这肯定有用。

相关问题