2011-09-14 6 views
0

오류가 입니다. ddlgvRooms '에 항목 목록에 존재하지 않아 유효하지 않은 SelectedValue가 있습니다. 매개 변수 이름 : 값Gridview EditTemplate DropDownlist

내가이 특정 문제 만 해결의 비와 문제가 많은 사람들이 같은 appenddatabounditems이 = "true"로 설정하는 등 몇 가지 다른 일을 시도 내 케이스에요 일한 읽어도 시도 itemcollection에 기본 null 값을 설정합니다. 내가 읽은 포럼의 대부분은 2 년 전부터 이미이 버그를 수정하고 뭔가를 간과하고 있기를 바랬다.

계단식 드롭 다운 목록을 gridview edittemplate 필드에서 사용하려고합니다. 내 detailsview에서 삽입 된 모든 것들을 위대한 작품을 만들었습니다.

MySetup 는 기본적으로 나는 created.The의 데이터 세트가 SQLSTOREDPROCEDURES 몇에서 자신의 데이터를 얻을 수있는 2 개 데이터 세트에서 데이터를 잡기 위해 가정되는이 기능 getRooms 및 getJacks이있는의 WebMethod 있습니다.

내 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 

답변

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

것 같습니다. 먼저 GridView.RowDataBound Event을 사용하여 드롭 다운 목록의 옵션을 채우고 선택한 값을 행의 intRoom 값으로 설정하십시오. ddlgvRooms에 런타임 이전에 결정할 수있는 정적 옵션 목록이 있으면 aspx 페이지에서 정의 할 수 있습니다. 그러면 현재의 상태를 확인할 수 있습니다.

+0

는 I 추가하려고 FirstRoom Tim

0

여기에 두 가지 문제가 있습니다 : 드롭 다운리스트 당신이 SelectedValue를 설정하는 시간에 채워되지 않은

  1. ;
  2. 당신은 설정하지 않은 DataTextField 및 DataValueField 속성 마크 업에서

다음 OnRowDataBound 이벤트에서

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

:

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

응답을 주셔서 감사합니다. 왜냐하면 2를 가지고 있기 때문에 FirstLoom SecondRoom 내가 생각했던 함수들은 아약스 익스텐더를 통해 내 드롭 다운리스트를 채워야한다고 생각했는데 왜 내가 드롭 다운리스트를 다시 채워 넣어야 할까? 내 드롭 다운리스트를 채우려 고 노력하는 내 함수와 충돌 할까? 나는이 문제에 대한 많은 연구를 한 끝에 Hello 제임스 – Tim

+0

제 2 기능을 추가했습니다. 내가해야 할 일은 해당 필드의 레이블 컨트롤에서 값을 드롭 다운 목록으로 전달하는 것입니다. DataSource = '<% # Bind ("intRoom") %>'를 수행하고 selectedvalue를 꺼내면 dropdownlist는 gridview에서 잘 작동하지만 레코드에서 값을 유지하지 못합니다. 레이블에서 값을 드롭 다운 목록으로 전달하는 방법이 있습니까? – Tim

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

희망을!

+0

응답을 주셔서 감사하지만 이것은 csharp에있는 것 같아요 그리고 VB는 또한 내가 데이터 세트로 채워지는 계단식 드롭 다운이 이미 내가 재사용하려고 노력하고 있습니다 그래서 내 코드가 너무 지저분하지 않습니다 사용하고 있습니다. – Tim

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

으로 변경하십시오.

관련 문제