在回发时刷新C#GridView数据

时间:2015-02-13 19:24:46

标签: c# asp.net gridview

所以,这是我的方案

我在自定义控件中有这个gridview。可以在单独的弹出窗口中打开此网格的每个行元素以编辑其详细信息(是的,弹出窗口,它是客户端想要的方式)

因此,要编辑和检索此行编辑数据,我将其存储在Session变量中以显示弹出窗口和稍后的详细信息

    ObjectType editObject = CurrentDS.FirstOrDeafult(o => o.Index == e.CommandArgument);
     Session["EditObjectVar"] = editObject;
     ScriptManager.RegisterStartupScript(this.Page, typeof(string), "OPEN_WINDOW", "window.open('ObjDetails.aspx', '_blank','scrollbars=yes,status=yes,toolbar=no,menubar=no,location=no,resizable=1,width=700,height=425,center=yes' );", true);

关闭并保存更改时,我再次存储在同一个Session变量上,并在父窗口上强制回发以刷新数据。

   Session.Remove("EditObjectVar");
    StoreValuesOnObject();
    Session["EditObjectVar"] = editObject;
    ScriptManager.RegisterStartupScript(this.Page, GetType(), "Close Popup", "window.opener.__doPostBack();window.close();", true);

在控制page_load事件中,我检查是否有回发,Session变量有数据,我需要刷新DS和gridview上的对象。

if (Page.IsPostBack && Session["EditObjectVar"] != null)
{
    ObjectType modObj = (ContainerType) Session["EditObjectVar"];
    ObjectType oldObj = CurrentDS.FirstOrDeafult(o => o.Index == modObj .Index);
    CurrentDS.Remove(oldObj);
    CurrentDS.Add(modObj);
    gv.DataSource = null;
    gv.DataSource = CurrentDS;
    gv.DataBind();
    Session.Remove("EditObjectVar");
}

一切都是正确的,我检索已编辑的对象,更多的是,鉴于在Session变量上,不仅存储对象,还存储了对象的内存位置,这意味着,通过强制回发,已编辑的对象已经存在更新了网格数据源(也存储在Session变量中),因此我使用更新的对象将gridview绑定到更新的DS,但仍然没有刷新gridview,它仍然从视图状态检索行状态

知道如何完成任务吗?我知道,更新面板是一个选项,但我没有使用绿灯

我已经有了类似的东西,对象的细节,还包含一个对象的集合,它在详细信息弹出窗口的gridview中显示,作为其父对象,用户也可以在单独的弹出窗口中打开子对象的细节窗口。之前描述的逻辑适用于此处,但是使用对象详细信息,对象子对象gridview会正确刷新!

已编辑:添加尽可能多的代码以便更好地解释,因为我在一个非常强大的保密协议下,在线发布真实代码可能会带来一些麻烦,但我已经出于想法

编辑2 :忘记在示例中添加.DataBind(),但它在代码中

编辑3 :忘了提一下,它没有刷新的GridView有控制权,可以直接在gridview上更改某些值。这是gridview的html

    <asp:GridView ID="gv" runat="server" ShowHeader="false" CellPadding="5" CellSpacing="0" EnableViewState="true" AutoGenerateColumns="False" OnRowCreated="RowCreated" 
    OnRowDataBound="RowDataBound"  GridLines="Both" BorderStyle="Solid" BorderColor="Black" BorderWidth="1px">
    <Columns>

     <asp:TemplateField>
            <ItemTemplate>
               <asp:ImageButton ID="imgDelete" runat="server"   CausesValidation="false"  AlternateText="Delete Part"
                     CommandName="cnt_delete" CommandArgument='<%# Eval("ContainerIndex") %>'  OnClick="imgDelete_Click"
                    ImageUrl="~/img/del.png" />
               <asp:ImageButton ID="imgDetails" runat="server"   CausesValidation="false"  AlternateText="View Cnt Details"
                     CommandName="cnt_details" CommandArgument='<%# Eval("ContainerIndex") %>'
                    ImageUrl="~/img/edit_icon.png" Height="15px" onclick="imgDetails_Click" />
                <asp:Label ID="lblNum" runat="server"  Text='<%# Eval("ContainerIndex") %>' ></asp:Label>
            </ItemTemplate>
            <ItemStyle  CssClass="subGridItem" VerticalAlign="Top" />
        </asp:TemplateField>        
     <asp:TemplateField>
            <ItemTemplate>
                <table style="FONT-SIZE: xx-small; FONT-FAMILY: Verdana; background-color:#F5F5F5" cellspacing="1" cellpadding="1"
            border="0" width="100%" >           
            <tr>                                            

                <td>
                      <asp:Label ID="lblQty" runat="server" Text="Qty" ></asp:Label>
                      <asp:Label ID="lblQtyRq" runat="server"  Text="*"></asp:Label>
                </td>
                    <td style="white-space:nowrap">
                     <asp:Label ID="lblWeight" runat="server" Text="Weight" ></asp:Label>
                     <asp:Label ID="lblWeightRq" runat="server"  Text="*"></asp:Label>
                </td>       
                <td style="white-space:nowrap">
                     <asp:Label ID="lblCntType" runat="server" Text="Container Type" ></asp:Label>
                     <asp:Label ID="lblCntTypeRq" runat="server"  Text="*"></asp:Label> 
                </td>

            </tr>
            <tr valign="top">           

            <td><asp:TextBox ID="txtQty"  Width="50px" runat="server" CssClass="detailsInput" Text='<%# Eval("Quantity") %>' MaxLength="7" ></asp:TextBox><br />
                <asp:RequiredFieldValidator ID="validatorQty" runat="server" ControlToValidate="txtQty" Display="Dynamic" ErrorMessage="Required" ></asp:RequiredFieldValidator>
                <asp:CompareValidator ID="CompareQty" runat="server"  Display="Dynamic" ControlToValidate="txtQty" Operator="GreaterThan" ValueToCompare="0" Type="Double"  ErrorMessage="invalid"></asp:CompareValidator>  
           </td>
                <td><asp:TextBox ID="txtWeight" Width="50px" runat="server" CssClass="detailsInput" Text='<%# Eval("Weight") %>' MaxLength="11" ></asp:TextBox><br />
                <asp:RequiredFieldValidator ID="ValidatorWgt" runat="server" ControlToValidate="txtWeight" Display="Dynamic" ErrorMessage="Required"></asp:RequiredFieldValidator>
                <asp:CompareValidator ID="CompareWeight" runat="server" Display="Dynamic" ControlToValidate="txtWeight" Operator="GreaterThan" ValueToCompare="0" Type="Double"  ErrorMessage="invalid"></asp:CompareValidator>
            </td>
            <td>
                <asp:DropDownList ID="lstCntTypes" runat="server"  ></asp:DropDownList><br />
                <asp:RequiredFieldValidator ID="validatorCntTypes" runat="server" CssClass="TPValidator" ControlToValidate="lstCntTypes" Display="Dynamic" ErrorMessage="Required"></asp:RequiredFieldValidator>
            </td>
            </tr>
            <tr><td colspan="12">
            <table width="100%" >
            <tr>                
                <td style="white-space:nowrap">
                    <asp:label id="lblProperShippingName" CssClass="TPLabel"  Runat="server" Visible="false">Proper shipping name</asp:label>
                    <asp:label id="lblProperShippingNameM" Runat="server" ForeColor="red" Font-Size="xx-small" Visible="false">*</asp:label></td>
                <td style="white-space:nowrap">
                    <asp:label id="lblHazClass" CssClass="TPLabel"  Runat="server" Font-Size="xx-small" Visible="false">Hazard class</asp:label>
                    <asp:label id="lblHazClassM" Font-Bold="true" Runat="server" ForeColor="red" Font-Size="xx-small" Visible="false">*</asp:label>
                </td>               
                <td style="white-space:nowrap">
                    <asp:label id="lblUNNumber" CssClass="TPLabel"  Runat="server" Visible="false" >UN/NA Identification Number</asp:label>
                    <asp:label id="lblUNNumberM" Runat="server" ForeColor="red" Font-Size="xx-small" Visible="false">*</asp:label>
                </td>
                <td style="white-space:nowrap">
                    <asp:label id="lblPackGroup" CssClass="TPLabel"  Runat="server" Visible="false" >Packing group</asp:label>
                    <asp:label id="lblPackGroupM" Font-Bold="true" Runat="server" ForeColor="red" Visible="false" >*</asp:label>
                </td>
                <td>
                    <asp:label id="lblIMO" CssClass="TPLabel"  Runat="server" Visible="False">IMO Classification</asp:label></td>
                <td><asp:label id="lblTunnel" CssClass="TPLabel" Runat="server" Visible="False">Tunnel Restriction</asp:label></td>
            </tr>
            </table>
           </td>        </tr>
        <tr>
        <td colspan="8">   </td></tr>
        </table>
            </ItemTemplate>
      <ItemStyle VerticalAlign="Top" />     
        </asp:TemplateField>  
    </Columns>
</asp:GridView>

正如您在此处所注意到的,txt输入都是从行属性的eval获取它们的值,但是lst没有。在RowDataBound事件上设置了lst值,我可以在那里看到修改后的值,但是它仍然显示从viewstate获取的值

2 个答案:

答案 0 :(得分:0)

我没有尝试跟踪所有内容,但这并不是因为你遗漏了“gv.DataBind();”在那里,是吗?我知道当你从PC应用程序来回切换到Web应用程序时会发生这种情况......

答案 1 :(得分:0)

所以,我终于要解决这个问题并让它发挥作用。

最后,我在网格所在的同一个自定义控件上设置了一个按钮,并让此控件检索它在Session上的信息并刷新网格,而不是在回调中执行此操作

编辑:此按钮由css隐藏在用户眼中(显示:无)。不是很花哨的方式,但是,它的工作原理

因此,在检索要编辑的对象时,我还会在Session中存储刷新DS的按钮的唯一ID

 ObjectType editObject = CurrentDS.FirstOrDeafult(o => o.Index == e.CommandArgument);
     Session["EditObjectVar"] = editObject;
     Session["BtnRefreshUniqueID"] = btnRefreshDS.UniqueID;
     ScriptManager.RegisterStartupScript(this.Page, typeof(string), "OPEN_WINDOW", "window.open('ObjDetails.aspx', '_blank','scrollbars=yes,status=yes,toolbar=no,menubar=no,location=no,resizable=1,width=700,height=425,center=yes' );", true);

当我即将存储并关闭详细信息弹出窗口时,我设置了回发功能,以便刷新DS,调用btnRefreshDS OnClick事件

    Session.Remove("EditObjectVar");
    StoreValuesOnObject();
    Session["EditObjectVar"] = editObject;
    ScriptManager.RegisterStartupScript(this.Page, GetType(), "Close Popup", String.Format("window.opener.__doPostBack('{0}', 'OnClick');window.close();", Session["BtnRefreshUniqueID"].ToString()), true);

而且,这是OnClick事件

protected void btnRefresDS_Click(object sender, EventArgs e)
{
    try
    { 
        if (Session["EditObjectVar"] != null)
        {
            gv.DataSource = CurrentDS;
            gv.DataBind();
            Session.Remove("EditObjectVar");
        }
    }
    catch (Exception ee)
    {
        MyPage.Log(ee.StackTrace);
        MyPage.Log(ee.Message);
    }
}

鉴于这一点,在Session变量上它存储了对象内存位置而不是对象本身,我已经在我的DS上有了更新的对象(也存储在Session上)所以我只需要将DS和调用数据绑定。

希望这对任何人都有帮助!