0

updatepanel 内に gridview があり、レコードを削除した後に更新されません。

<ajax:UpdatePanel ID="SearchResultAjax" runat="server" UpdateMode="Always">
<ContentTemplate>
<asp:GridView runat="server" ID="mwOffersGrid" AutoGenerateColumns="False" Width="100%" DataKeyNames="OfferId" OnRowCommand="mwOffersGrid_RowCommand"   
    <Columns>
        <asp:TemplateField HeaderText="Offer #">
        <ItemTemplate>
            <asp:HyperLink runat="server" ID="offerIdLink" NavigateUrl='<%# String.Format("/Admin/Marketing/MWOffers/EditOffer.aspx?OfferId={0}",Eval("OfferId")) %>'
            Text='<%# Eval("OfferId") %>' />
        </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField>
            <ItemStyle HorizontalAlign="Right" Wrap="false" />
            <ItemTemplate>
            <asp:ImageButton ID="EditButton" runat="server" CommandName="EditOffer" CommandArgument='<%# Eval("OfferId") %>' ToolTip="Edit" SkinID="EditIcon" />
            <asp:ImageButton ID="DeleteButton" runat="server" CommandName="DeleteOffer" CommandArgument='<%# Eval("OfferId") %>'  ToolTip="Delete"
            SkinID="DeleteIcon" OnClientClick='<%# Eval("OfferId", "return confirm(\"Are you sure you want to delete Offer # {0}?\")") %>' />
            </ItemTemplate>
    </asp:TemplateField>
    </Columns>
</asp:GridView>
</ContentTemplate>
</ajax:UpdatePanel>

コードビハインド

protected void Page_Load(object sender, EventArgs e)
  {
    MWOffersCollection OffersCollection = MWOffersDataSource.LoadForCriteria(SqlCriteria, "OfferPageType ASC, OrderBy ASC");
    if (!Page.IsPostBack)
    {
      if (OffersCollection != null)
      {
            BindGrid();
      }
    }
  }

  public void BindGrid()
  {
    mwOffersGrid.DataSource = OffersCollection;
    mwOffersGrid.DataBind();
  }

protected void mwOffersGrid_RowCommand(object sender, GridViewCommandEventArgs e)
  {
    switch (e.CommandName)
    {

    case "EditOffer":
        var offerId = AlwaysConvert.ToInt(e.CommandArgument);
        Response.Redirect(string.Format("~/Admin/Marketing/MWOffers/EditOffer.aspx?OfferId={0}", offerId));
        break;

    case "DeleteOffer":
          var id = AlwaysConvert.ToInt(e.CommandArgument);
                    OffersCollection.Cast<MWOffers>().Single(o => o.OfferId == id).IsValid = false;
                    OffersCollection.Save();
                    BindGrid();
                    break;
        break;
    }
  }
4

3 に答える 3

1

これは私の更新された答えです。問題は、ページの読み込み時にコレクション アイテムを読み込むことです。

MWOffersCollection OffersCollection;
protected void Page_Load(object sender, EventArgs e)
{
   if (!IsPostBack)
   {
      BindGrid();          
   }
}

private void BindGrid()
{
 OffersCollection = MWOffersDataSource.LoadForCriteria(SqlCriteria, "OfferPageType ASC, OrderBy 
ASC");
  mwOffersGrid.DataSource = OffersCollection;
    mwOffersGrid.DataBind();
}

protected void mwOffersGrid_RowCommand(object sender, GridViewCommandEventArgs e)
{
   switch (e.CommandName)
   {
     case "EditOffer":
       var offerId = AlwaysConvert.ToInt(e.CommandArgument);
       Response.Redirect(string.Format("~/Admin/Marketing/MWOffers/EditOffer.aspx?OfferId={0}", offerId));
       break;

     case "DeleteOffer":
        var id = AlwaysConvert.ToInt(e.CommandArgument);
        DeleteRow(id);
        BindGrid(); //bind the grid again
       break;
   }
}
private void DeleteRow(int id)
{
  var id = AlwaysConvert.ToInt(e.CommandArgument);
  OffersCollection.Cast<MWOffers>().Single(o => o.OfferId == id).IsValid = false;
  OffersCollection.Save();
}
于 2013-09-26T13:23:02.403 に答える
1

私は同様の作業を行いましたが、テンプレートの編集を通じて行っていました。これにより、さまざまなバインド操作を非常に簡単に制御できました。たとえば、私のgridviewタグコードは

 <asp:GridView ID="gvTrip" runat="server" AutoGenerateColumns="False" OnRowDataBound="gvTrip_RowDataBound"
                                            CellPadding="4" DataKeyNames="trip_code" ForeColor="#333333" GridLines="None"
                                            OnRowCancelingEdit="gvTrip_RowCancelingEdit" OnRowDeleting="gvTrip_RowDeleting"
                                            OnRowEditing="gvTrip_RowEditing" OnRowUpdating="gvTrip_RowUpdating" RowStyle-Height="10px">

その後、2 つのコマンド フィールドを指定しました。

 <asp:CommandField HeaderText="Edit-Update" ShowEditButton="True" ItemStyle-Width = "100px"/>
    <asp:CommandField HeaderText="Delete" ShowDeleteButton="True" ItemStyle-Width = "100px"/>

例として、アイテムと編集の 2 つの部分にグリッド アイテム テンプレートがありました。

<asp:TemplateField HeaderText="Trip End Time">

<ItemTemplate>
                                                        <asp:Label ID="lblgTripEndTime" runat="server" Text='<%# Bind("TRIP_END_TIME") %>' Width="100px"></asp:Label>
                                                    </ItemTemplate>

                                                    <EditItemTemplate>
                                                        <asp:TextBox ID="txtgTripEndTime" Visible="true" runat="server" 
                                                           Text='<%# Bind("TRIP_END_TIME") %>' MaxLength="5" CssClass="phoneNumber1" Width="100px"> </asp:TextBox>


                                                    </EditItemTemplate>           
</EditItemTemplate>  

今私の削除コードは非常に簡単です

protected void gvTrip_RowDeleting(object sender, GridViewDeleteEventArgs e)
    {

        string strTripCode = Convert.ToString(((Label)gvTrip.Rows[e.RowIndex].FindControl("lblgTripCode")).Text.Trim());
        objMasterTransport.deleteTripDetail(strTripCode);

        BindData();
        DropdownhelperENT.PopulateDistinctDropDown(drpDateSelection, "TRANS_M_TRIP", "TRIP_DATE");
    }
于 2013-09-26T13:26:46.830 に答える
1

これを試して

var id = AlwaysConvert.ToInt(e.CommandArgument);
         OffersCollection.Cast<MWOffers>().Single(o => o.OfferId == id).IsValid = false;
                OffersCollection.Save();
BindGrid();
SearchResultAjax.Update();
break;

これSearchResultAjax.Update();により、gridview データ バインディングが発生した後にパネルが更新されます。

于 2013-09-26T14:30:27.290 に答える