2011-09-14 13 views
0

エラーはです。ddlgvRoomsのSelectedValueは、項目のリストに存在しないため無効です。 パラメータ名:値Gridview EditTemplate DropDownlist

は、私は、この特定の問題が、フィックスの非の問題を持つ人々の多くは、このようなappenddatabounditems =「true」を設定するなど、いくつかの異なるものを試してみました、私のcase.Iのために働いている読んでも試してみましたitemcollectionにデフォルトのヌル値を設定します。 私が読んだこのフォーラムのほとんどは、すでにこのバグを修正してほしいと思っていて、何かを見落としていると思っていました。

私はカスケードドロップダウンリストをgridview edittemplateフィールドで動作させようとしています。私はinsertviewのすべてのディテールビューでこれらを作成しました。

MySetupを は基本的に私は、私はcreated.TheデータセットがSQLSTOREDPROCEDURESのカップルからデータを取得してい2つのデータセットからのデータをつかむことになっている2つの機能のgetRoomsとgetJacksを持つWebメソッドを持っています。

私の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"); 文字列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

私が追加しようとした FirstRoom SecondRoom しかし、まだ同じエラーが返されました – Tim

0

ここで考えられる原因は2つありますDropDownListコントロールを使用すると、SelectedValueのを設定している時に読み込まれていない

  1. あなたが設定していない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

返信いただきありがとうございます。私が考えていた関数は、なぜajaxエクステンダーを介してドロップダウンリストに値を設定していたのでしょうか?同じドロップダウンリストを作成しようとする私の関数と競合するドロップダウンリストを再作成する必要がありますか?この問題について多くの研究をした後、私の2つの機能をトップ – Tim

+0

Hello Jamesに追加しました。私がする必要があると思うのは、そのフィールドのラベルコントロールから値をドロップダウンリストに渡すことです。 DataSource = '<%#Bind( "intRoom")%>'を実行してselectedvalueを取ると、ドロップダウンリストは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") %>'

に変更してください。

関連する問題