3

私はASP.Netを初めて使用し、UpdatePanel内でGridViewコントロールがどのように機能するかについて混乱しています。

「デフォルトでは、UpdatePanelコントロール内のポストバックコントロールは非同期のポストバックを引き起こし、パネルのコンテンツを更新します」というドキュメントをここで読みました。それでも、GridViewとButtonコントロールを要素内に配置すると、ボタンにgrid1.DataBind();を実行するための定義済みのOnClickイベントがない限り、グリッドはデータを更新しません。また、ボタンのUpdatePanelでAsyncPostBackTriggerを指定してみましたが、同じ動作が得られました。ここで、OnClickイベントなしでButtonを押すと、UpdatePanelが更新されることに気付きましたが、その中のGridViewは更新されません。これに光を当てていただけませんか?明示的に更新するには、コードビハインドを常に呼び出す必要がありますか?

Web.Configの接続文字列

    <connectionStrings>
        <add name="myConnectionString"
             connectionString="Data Source=XXXXX;Initial Catalog=XXXX;Persist Security Info=True;User ID=XXXXX;Password=XXXXX"
             providerName="System.Data.SqlClient" />
    </connectionStrings>

私のDefault.aspx

 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="EmptyWebApp.Default" %>
 <!DOCTYPE html>
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head runat="server"> <title></title> </head>
 <body>
     <form id="form1" runat="server">
         <div>
             <asp:ScriptManager ID="ScriptManager" runat="server" EnablePartialRendering="true" />
             <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
                 <ContentTemplate>
                     <asp:GridView ID="grid1" runat="server" DataSourceID="SQLDevelopment" AutoGenerateColumns="False">
                         <Columns>
                             <asp:BoundField DataField="UserID" HeaderText="UserID" SortExpression="UserID" />
                             <asp:BoundField DataField="Date" HeaderText="Date" SortExpression="Date" />
                         </Columns>
                     </asp:GridView>
                     <asp:SqlDataSource ID="SQLDevelopment" runat="server"
                    ConnectionString="<%$ ConnectionStrings:myConnectionString %>" 
                    SelectCommand="SELECT * FROM [TestTableA]"></asp:SqlDataSource>
                <%=DateTime.Now.ToString()%> <br />
                <asp:Button ID="btnRefresh" runat="server" Text="Refresh without C# event"/>
                <asp:Button ID="btnRefresh1" runat="server" Text="Refresh with C# event" OnClick="btnRefresh1_Click"/>
            </ContentTemplate>
        </asp:UpdatePanel>
    </div>
 </form></body><html>

btnRefresh1の背後にある私のコード

    protected void btnRefresh1_Click(object sender, EventArgs e)
    {
        grid1.DataBind();
    }

ありがとうございました

4

3 に答える 3

3

update-panel コードに問題はありません。問題は、ポストバック時に grid-view が data-source からデータを再度要求しないことです。代わりに、ビューステートを使用して対応するデータを読み込みます。

ただし、 を呼び出すと、DataBindグリッドビューがデータ ソースからデータを再度取得するよう強制され、それによって更新されます (または、グリッド ビューのビューステートを無効にすることもできます) 。メソッドのドキュメントを参照してください。サンプル コード内のコメントも同じです。

DataBind更新ボタンに呼び出しを追加したくない場合は、同じことを行うことができます。Page_Loadこれにより、すべてのポストバックでグリッドが更新されます (それを引き起こしたコントロールに関係なく)。

于 2012-11-30T11:28:47.193 に答える