Gridview EditTemplate DropDownlist - PullRequest
       3

Gridview EditTemplate DropDownlist

0 голосов
/ 14 сентября 2011

Ошибка: ddlgvRooms 'имеет значение SelectedValue, которое недопустимо, поскольку его нет в списке элементов.Имя параметра: значение

Я читал много людей, имеющих проблемы с этой конкретной проблемой, но ни одно из исправлений не сработало для моего случая. Я пробовал несколько разных вещей, таких как установка appenddatabounditems = "truemsgstr "также пытался установить в коллекции элементов значение по умолчанию.Большинство постов на этом форуме, которые я прочитал, были сделаны пару лет назад, и я надеюсь, что они уже исправили эту ошибку, и я просто что-то упускаю.

Я пытаюсь заставить свой каскадный выпадающий список работать в шаблоне редактирования сетки видаполя.Я создал их в моем подробном представлении о вставке, все прекрасно работает.

MySetup В основном у меня есть веб-метод, который имеет 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 ]

1 голос
/ 22 сентября 2011

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();
1 голос
/ 14 сентября 2011

Возможно, страница пытается установить выбранное значение в раскрывающемся списке до его заполнения.Попробуйте использовать GridView.RowDataBound Event , чтобы сначала заполнить параметры раскрывающегося списка, а затем установить выбранное значение на значение строки intRoom.Если ddlgvRooms имеет статический список опций, которые могут быть определены до выполнения, определите их на странице aspx, и тогда вы сможете сделать это так, как в настоящее время.

0 голосов
/ 26 октября 2012

У меня есть очень простое решение вашей проблемы.

<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") %>'

Это работает точно.

0 голосов
/ 14 сентября 2011

Это сработало для меня.При заполнении GridView вы должны заполнить каждый DropDownList в событии RowDataBound:

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

Надеюсь, это поможет!

0 голосов
/ 14 сентября 2011

Здесь возможны две проблемы:

  1. DropDownList не был заполнен во время установки SelectedValue;
  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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...