gridview dissapears on rowediting, clicking between two functions brings it back with the item expanded

StackOverflow https://stackoverflow.com/questions/16423474

  •  14-04-2022
  •  | 
  •  

سؤال

Not sure if this is an odd one or not, but i have a gridview that dissapears on rowediting,

my steps are > click butUsers > click edit > grid dissapears > click butDev > grid is back > click ButUsers > grid loads with my selected item in editmode.

whats missing from my event?

Thanks

Codebehind

using System;
using System.Collections.Generic;
using System.Linq;
using System.Data;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class equipment : System.Web.UI.Page
{
    public string strMode;
    ParameterCollection pcEquip;

    dsData.tblEquipmentDataTable dtEquipment;
    dsDataTableAdapters.tblEquipmentTableAdapter taEquipment;
    SqlDataSource dsEquipment;

    protected void Page_Load(object sender, EventArgs e)
    {
        dtEquipment = new dsData.tblEquipmentDataTable();
        taEquipment = new dsDataTableAdapters.tblEquipmentTableAdapter();
        dsEquipment = new SqlDataSource();

        smEquipment.RegisterAsyncPostBackControl(butUsers);
    }
    protected void butUsers_Click(object sender, EventArgs e)
    {
        hidMode.Value = "Users";
        dtEquipment.Clear();
        taEquipment.FillByUsers(dtEquipment);
        gvItems.DataSource = dtEquipment;
        gvItems.DataBind();

        upTable.Update();
    }
    protected void butDevelopment_Click(object sender, EventArgs e)
    {
        //hidMode.Value = "Users";
        dtEquipment.Clear();
        taEquipment.FillByDev(dtEquipment);
        gvItems.DataSource = dtEquipment;
        gvItems.DataBind();

        upTable.Update();
    }
    protected void gvItems_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
    }
    protected void gvItems_RowEditing(object sender, GridViewEditEventArgs e)
    {
        gvItems.EditIndex = e.NewEditIndex;
        gvItems.DataSource = dtEquipment;
        gvItems.DataBind();
        upTable.Update();

    }
}

ASPX PAGE

<asp:Content ID="cntCenter" ContentPlaceHolderID="CenterContent" runat="Server">
    <asp:UpdatePanel runat="server" ID="upTable" UpdateMode="Conditional">
        <ContentTemplate>
            <asp:HiddenField runat="server" ID="hidMode" />
            <grid:TemplateGridView
                EnableTemplateEditing="True"
                runat="server" ID="gvItems" OnRowDataBound="gvItems_RowDataBound" OnRowEditing="gvItems_RowEditing"
                AutoGenerateColumns="False" DataKeyNames="ID" AllowPaging="True" 
                AllowSorting="True" CssClass="table" BorderStyle="None" BorderWidth="0px"
                GridLines="None">
                <Columns>
                    <asp:CommandField ShowEditButton="True" ShowDeleteButton="True" />
                    <asp:BoundField DataField="ID" HeaderText="ID" InsertVisible="False"
                        ReadOnly="True" SortExpression="ID" Visible="False" />
                    <asp:BoundField DataField="UserID" HeaderText="UserID"
                        SortExpression="UserID" Visible="False" />
                    <asp:BoundField DataField="AssetNo" HeaderText="Asset No" 
                        SortExpression="AssetNo" />
                    <asp:BoundField DataField="Username" HeaderText="User Name"
                        SortExpression="Username" />
                </Columns>
                <EditItemTemplate>
                    <div class="details">
                        <asp:HiddenField ID="hidID" runat="server" Value='<%# Eval("ID") %>' />
                        <asp:HiddenField ID="hidUserID" runat="server" ClientIDMode="Static" Value='<%# Bind("UserID") %>' />
                        <table class="detailsview" cellpadding="0" cellspacing="0">
                            <tr>
                                <td class="td_title_align">Asset No:</td>
                                <td>
                                    <asp:TextBox ID="txtAssetNo" runat="server" CssClass="edit_box" Text='<%# Bind("AssetNo") %>' />
                                </td>
                                <td class="td_title_align">CPU:</td>
                                <td>
                                    <asp:TextBox ID="txtCPU" runat="server" CssClass="edit_box" Text='<%# Bind("CPU") %>' />
                                </td>
                                <td class="td_title_align">Shipped Date:</td>
                                <td>
                                    <asp:TextBox ID="txtShippedDate" runat="server" CssClass="edit_box" Text='<%# Bind("ShippedDate", "{0:dd/MM/yyyy}") %>' />
                                </td>
                            </tr>
                            <tr>
                                <td colspan="8">
                                    <div class="footer_command">
                                        <asp:Button runat="server" ID="btnUpdate" CommandName="Update" Text="Update" CssClass="command_button" />
                                        <asp:Button runat="server" ID="btnCancel" CommandName="Cancel" Text="Cancel" CssClass="command_button" />
                                    </div>
                            </tr>
                        </table>
                    </div>
                </td>
            </tr>
                </EditItemTemplate>
            </grid:TemplateGridView>
        </ContentTemplate>
    </asp:UpdatePanel>
</asp:Content>
هل كانت مفيدة؟

المحلول

You only have to bind once during pageLoad. I think this code block executes on every Postback in your current code, so this might be rebinding your data tables. You can check by placing a break point on pageload in debug mode (This will be called on every postback). This might solve your problem

 protected void Page_Load(object sender, EventArgs e)
    {
       if(!Page.IsPostback)
       {
         dtEquipment = new dsData.tblEquipmentDataTable();
        taEquipment = new dsDataTableAdapters.tblEquipmentTableAdapter();
        dsEquipment = new SqlDataSource();
        smEquipment.RegisterAsyncPostBackControl(butUsers);
        }
    }

Edit What I can understand from your code is that you were initializing data tables & table adapters on pageLoad. Now after, we have put the initialization code inside if(!Page.IsPostBack) you would get null references because they are not yet initialized (They were initialized on PageLoad event).

Remember HTTP is stateless

. To save state of these tables on each postback, you can either use Viewstate or Session.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top