2009-06-15 27 views
4

私はアイテムのリストを表示するのにlistviewを使用し、各アイテムに機能のリストを表示するためにネストされたリストビューを使用しています。親リストビューと子リストビューの両方で、挿入操作、編集操作、および削除操作が可能である必要があります。親リストビューではうまく動作します。しかし、子アイテムを編集しようとすると、編集ボタンは編集モードにはなりません。あなたは私のコードで私が見逃していることを私に提案できますか?背後にネストされたリストビュー内のデータを編集する方法

<asp:ListView ID="lvParent" runat="server"     
       OnItemDataBound="lvParent_ItemDataBound" 
       onitemcanceling="lvParent_ItemCanceling" onitemcommand="lvParent_ItemCommand" 
       DataKeyNames="ItemID" onitemdeleting="lvParent_ItemDeleting" 
       oniteminserting="lvParent_ItemInserting" > 
       <LayoutTemplate>           
        <asp:PlaceHolder ID="itemPlaceholder" runat="server"></asp:PlaceHolder> 
        <div align="right"> 
         <asp:Button ID="btnInsert" runat="server" Text="ADD Item" onclick="btnInsert_Click"/> 
        </div> 
       </LayoutTemplate> 
       <ItemTemplate> 
        <table runat="server" cellpadding="0" cellspacing="0" border="0" width="100%"> 
         <tr> 
          <td> 
           <div id="dvDetail"> 
            <span >Description</span> 

            <asp:TextBox ID="txtDescription" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Description") %>' TextMode="MultiLine" ></asp:TextBox> 

           </div>         
           <div id="dvFeature" > 
            <span>Feature List</span>                 
            <asp:ListView ID="lvChild" runat="server" 
             InsertItemPosition="LastItem" 
             DataKeyNames="FeatureID" OnItemCommand="lvChild_ItemCommand" 
             OnItemCanceling="lvChild_ItemCanceling" OnItemDeleting="lvChild_ItemDeleting" 
             OnItemEditing="lvChild_ItemEditing" OnItemInserting="lvChild_ItemInserting" OnItemUpdating="lvChild_ItemUpdating" 
             DataSource='<%# DataBinder.Eval(Container.DataItem, "FeatureList") %>' > 
             <LayoutTemplate> 
              <ul > 
               <asp:PlaceHolder runat="server" ID="itemPlaceHolder" ></asp:PlaceHolder>                                
              </ul> 
             </LayoutTemplate> 
             <ItemTemplate> 
              <li> 
               <span class="dvList"><%# DataBinder.Eval(Container.DataItem, "FeatureTitle")%></span>             

               <div class="dvButton" > 
                <asp:ImageButton ID="btnEdit" runat="server" ImageUrl="/Images/edit_16x16.gif" AlternateText= "Edit" CommandName="Edit" CommandArgument='<%# DataBinder.Eval(Container.DataItem, "FeatureID") %>' Width="12" Height="12" /> 
                <asp:ImageButton ID="btnDelete" runat="server" ImageUrl="/Images/delete_16x16.gif" AlternateText= "Delete" CommandName="Delete" CommandArgument='<%# DataBinder.Eval(Container.DataItem, "FeatureID") %>' Width="12" Height="12" /> 

               </div> 

              </li> 

             </ItemTemplate> 
             <EditItemTemplate> 
              <li> 
               <asp:TextBox ID="txtFeature" Text='<%# DataBinder.Eval(Container.DataItem, "FeatureTitle")%>' runat="server"></asp:TextBox> 

               <div class="dvButton"> 
                <asp:ImageButton ID="btnUpdate" runat="server" ImageUrl="/Images/ok_16x16.gif" AlternateText= "Update" CommandName="Update" CommandArgument='<%# DataBinder.Eval(Container.DataItem, "FeatureID") %>' Width="12" Height="12" /> 
                <asp:ImageButton ID="btnCancel" runat="server" ImageUrl="/Images/delete_16x16.gif" AlternateText= "Cancel" CommandName="Cancel" Width="12" Height="12" CausesValidation="false" /> 

               </div> 

              </li> 
             </EditItemTemplate> 
             <InsertItemTemplate>            
               <asp:TextBox ID="txtFeature" runat="server"></asp:TextBox> 

               <div class="dvButton"> 
                <asp:ImageButton ID="btnInsert" runat="server" ImageUrl="/Images/ok_16x16.gif" AlternateText= "Insert" CommandName="Insert" Width="12" Height="12" /> 
                <asp:ImageButton ID="btnCancel" runat="server" ImageUrl="/Images/delete_16x16.gif" AlternateText= "Cancel" CommandName="Cancel" Width="12" Height="12" CausesValidation="false" /> 

               </div> 

             </InsertItemTemplate> 
            </asp:ListView> 
           </div>         
          </td> 

         </tr> 
         <tr> 
          <td align="right"> 
           <div id="dvButton" > 
            <asp:Button ID="btnSave" runat="server" Text="Save" 
             CommandName="Save" 
             CommandArgument='<%# DataBinder.Eval(Container.DataItem, "ItemID") %>' /> 
            <asp:Button ID="btnDelete" runat="server" Text="Delete" CssClass="Cancel" 
             CommandName="Delete" 
             CommandArgument='<%# DataBinder.Eval(Container.DataItem, "ItemID") %>' /> 
           </div> 
          </td> 

         </tr>     
        </table>     
       </ItemTemplate>     

      </asp:ListView> 

コード:

protected void Page_Load(object sender, EventArgs e) 
     {  
      if (Page.IsPostBack == false) 
      {     
       BindData(); 
      }   

     } 

private void BindData() 
     { 
      MyDataContext data = new MyDataContext(); 
      var result = from itm in data.ItemLists 
         where itm.ItemID == iItemID 

         select new 
         { 
          itm.ItemID, 
          itm.Description,        
          FeatureList = itm.Features 
         }; 

      lvParent.DataSource = result; 
      lvParent.DataBind(); 

     } 

protected void lvChild_ItemEditing(object sender, ListViewEditEventArgs e) 
     { 
      ListView lvChild = sender as ListView;    

      lvChild.EditIndex = e.NewEditIndex; 

      lvChild.DataBind(); 

     } 

編集:私は 'ItemEditing' イベントで "lvChild.DataBindを()" を使用する場合

protected void lvChild_ItemEditing(object sender, ListViewEditEventArgs e) 
      { 
       ListView lvChild = sender as ListView;    

       lvChild.EditIndex = e.NewEditIndex; 

       lvChild.DataBind(); 

      } 

、子アイテムの総リストが消えます「編集」をクリックした場合

protected void lvChild_ItemEditing(object sender, ListViewEditEventArgs e) 
      { 
       ListView lvChild = sender as ListView;    

       lvChild.EditIndex = e.NewEditIndex;    


      } 

ItemEditingイベントで 'lvChild.Databind'を削除すると、 'edit'ボタンを2回クリックすると編集モードになります。また、EditItemTemplateのテキストボックスコントロールが表示されますが、空白のテキストボックスとして表示されます(既存の値を編集にバインドしません)。

答えて

2

これは興味深い問題です。ほぼ確実にデータバインディングの問題。編集モードに入るためには次の2つのことを行う必要があります。

1)EditIndex
2セット)しかし...ときレンダリング呼び出されるんネストされたリピータの場合にDataBind()

を呼び出しますか?私はあなたが正しくすべてをレンダリングするために、親にDataBind()を呼び出さなければならないと思う。その場合、親を再バインドしているので、EditIndex AGAINを設定する必要があります。

編集: OK ...これはネストされたGridViewでこれを試したところ、編集モードに入るためにサブグリッドを取得するために親をDataBind()する必要はありませんでした。今私は自分の答えをdownvoteする必要があります。 :|

+0

あなたの誇り – keni

0

誰かに、どこかで役立つことを望みます。

1)私が編集しているときウィッヒは、ユーザーコントロールを保持するリストビューを持っている:

はここでそれを動作させるために私のコードです。

public int EditIndexComposition; 

protected void ItemEditing(object sender, ListViewEditEventArgs e) 
     { 
      C_LV_MyObjects.EditIndex = e.NewEditIndex; 
      C_LV_MyObjects.DataBind(); 
     } 

     protected void MyObjectEditing(object sender, EventArgs e) 
     { 
      ListViewEditEventArgs MyEvent = (ListViewEditEventArgs)e; 
      if (MyEvent != null) 
       EditIndexComposition= MyEvent.NewEditIndex; 

      C_LV_MyObjects.DataBind(); 

     } 

     protected void DataBoundMyObjects(object sender, ListViewItemEventArgs e) 
     { 
      MyUC uc = (MyUC)e.Item.FindControl("C_UC_MyUserControl"); 

      if (uc!=null) 
      { 
       uc.EditIndex = EditIndexComposition; 
       ListViewDataItem dataItem = (ListViewDataItem)e.Item; 
       MyObject obj= (MyObject)dataItem.DataItem; 
       uc.DataSource=Myservice.GetDatasource(obj.Id); 
       uc.DataBind(); 

      } 
     } 

と、次のように私のユーザーコントロールのコードは次のとおりです:

<asp:PlaceHolder runat="server" ID="C_PH_ObjComposition"> 
    <asp:ListView runat="server" ID="C_LV_AppaltatoreComposizione" DataSource="<% # DataSource %>" 
     DataKeyNames="Id" OnItemEditing="ItemEditing"> 

      etc... 

<ItemTemplate> 
      <tr> 
       <td> 
        <asp:LinkButton runat="server" CommandName="Edit" Text="Edit"></asp:LinkButton> 
       </td> 
      </tr> 
     </ItemTemplate> 
     <EditItemTemplate> 
      <tr> 
       <td> 
        Edit Mode 
       </td> 
      </tr> 
     </EditItemTemplate> 
    </asp:ListView> 
</asp:PlaceHolder> 

とこのユーザーcotnrol自体は次のように、このリストビューのコードC#がある

<asp:ListView runat=server ID=C_LV_MyObjects DataKeyNames="Id" 
    OnItemDataBound=DataBoundMyObjects OnItemEditing=ItemEditing 
    > 
<LayoutTemplate> 
      <table runat=server id="itemPlaceholderContainer"> 
       <tr> 
        <th> 
         Description 
        </th> 
       </tr> 
       <tr runat="server" id="itemPlaceholder"> 
       </tr> 
      </table> 
     </LayoutTemplate> 
     <ItemTemplate> 
      <tr> 
       <td> 
        text... 
       </td> 
       <td> 
        <asp:LinkButton runat="server" CommandName="Edit" Text="Edit"></asp:LinkButton> 
       </td> 
       <td> 
        <asp:LinkButton runat="server" CommandName="Delete" Text="Delete"></asp:LinkButton> 
       </td> 
     </ItemTemplate> 
     <EditItemTemplate> 
      <tr> 
       <td colspan=3> 
        <MyTag:MyUC ID=C_UC_MyUserControl runat=server 
           OnEditing=MyObjectEditing 
           /> 
       </td> 
      </tr> 
     </EditItemTemplate> 
     <EmptyDataTemplate> 
      No results found! 
     </EmptyDataTemplate> 
    </asp:ListView> 

内部リストビューを持っています次のコードC#:

public int EditIndex 
     { 
      get {return C_LV_ObjComposition.EditIndex;} 
      set { C_LV_ObjComposition.EditIndex=value;} 
     } 

public event EventHandler Editing; 

protected void ItemEditing(object sender, ListViewEditEventArgs e) 
     { 
      C_LV_ObjComposition.EditIndex = e.NewEditIndex; 

      if (Editing != null) 
       Editing(this, e); 

     } 

innerlistviewのeditボタンをクリックすると、クリックされたインデックスが保存され、最初のコンテナユーザコントロールに関数がトリガされます。この関数は、索引がグローバル値に格納され、索引リストのデータバインドをトリガーします。 onitemdataboundを取得すると、適切な値でユーザーコントロールを再作成します。その後、usercontrolのデータバインディングを編集行のインデックスに割り当てることができます。ご質問があれば、...

CIAOにお答えすること自由に感じなさいすべてです

関連する問題