7

すべてのグリッドビュー値を別のページに渡したいのですが、以下のように、PatientDetails.aspx ページに 1 つのグリッドビューと 1 つのボタンがあります。

<asp:GridView ID="gvDoctorList" runat="server" AutoGenerateColumns="False" DataSourceID="SqlDataSource1" 
    AllowPaging="True" AllowSorting="True" AutoGenerateEditButton="true" AutoGenerateSelectButton="true"
    AutoGenerateDeleteButton="true" OnSelectedIndexChanged="gvDoctorList_SelectedIndexChanged" OnRowCommand="gvDoctorList_RowCommand">
    <Columns>
        <asp:TemplateField>
            <ItemTemplate>
                <asp:CheckBox runat="server" ID="chk" OnCheckedChanged="chk_CheckedChanged" AutoPostBack="true" />
                <asp:Label runat="server" ID="lblPID" Visible="false" Text='<%# Eval("PatientId") %>'></asp:Label>
                <asp:Button ID="btnSelect" runat="server" Text="Select" CommandName = "Select" />
            </ItemTemplate>
        </asp:TemplateField>

        <asp:BoundField DataField="PatientId" HeaderText="PatientId" SortExpression="PatientId" />
        <asp:BoundField DataField="firstname" HeaderText="firstname" SortExpression="firstname" />
        <asp:BoundField DataField="lastname" HeaderText="lastname" SortExpression="lastname" />                                
        <asp:BoundField DataField="sex" HeaderText="sex" SortExpression="sex" />
    </Columns>
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:MyDatabaseConnectionString %>" 
    SelectCommand="SELECT [PatientId],[firstname], [lastname], [sex] FROM [PatientDetails]"></asp:SqlDataSource>
<asp:Button ID="btnformatric" runat="server" Text="formatric3d" OnClick="btnformatric_Click" OnCommand="btnformatric_Command" />

PatientDetails.aspx の分離コードは次のとおりです。

protected void btnformatric_Click(object sender, EventArgs e)
{
    if (gvDoctorList.SelectedRow != null)
    {
        Server.Transfer("Patientstaticformatrix.aspx");
    }
    else
    {
        ClientScript.RegisterStartupScript(this.GetType(), "alert", "alert('Please select a row.')", true);
    }
}

2 番目のページ名 Patientstaticformatrix.aspx のコード ビハインドは次のとおりです。

protected void Page_Load(object sender, EventArgs e)
{
    if (this.Page.PreviousPage != null)
    {
        GridView gvDoctorList = (GridView)this.Page.PreviousPage.FindControl("gvDoctorList");

        GridViewRow selectedRow = gvDoctorList.SelectedRow;
        Response.Write("PatientId: " + selectedRow.Cells[0].Text + "<br />");
        Response.Write("firstname: " + selectedRow.Cells[1].Text + "<br />");
        Response.Write("lastname: " + selectedRow.Cells[2].Text + "<br />");
    }
}

2 ページ目のコードをデバッグしました....gvDoctorList の値が null であり、selectedRow が nullreference のエラーを示しています。

どこが間違っているのか教えてください。

4

6 に答える 6

4

以前の質問も見たので、グリッドビューをセッションに保持するのではなく(高価です)RowCommand、イベントを使用できることを1つ提案できます。ここで確認した後、チェックボックスやイベントはbutton必要ないと思います。を次のページにchk_CheckedChanged渡すことPatientIDができ、クエリを記述して、選択した行データを新しいテーブルに挿入できます。

 <asp:TemplateField>
       <ItemTemplate>
        <asp:CheckBox runat="server" ID="chk" OnCheckedChanged="chk_CheckedChanged"  
         AutoPostBack="true" />
        <asp:Label runat="server" ID="lblPID" Visible="false" Text='<%# Eval("PatientId") %>'> 
       </asp:Label>
      <asp:Button ID="btnSelect" runat="server" Text="Select" CommandArgument='<%# 
       Eval("PatientId") %>' CommandName = "Select" />
      </ItemTemplate>
    </asp:TemplateField>



 protected void gvDoctorList_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            if (e.CommandName == "select")
            {
                int pID = Convert.ToInt32(e.CommandArgument);
                // either put ID in session and check 
                Session["PatientID"] = Convert.ToString(pID);
                Server.Transfer("Patientstaticformatrix.aspx");
            }
        }

On page_Load イベント

 protected void Page_Load(object sender, EventArgs e)
    {
         string pID = Convert.ToString(Session["PatientID"]);
            if(!string.IsNullOrEmpty(pID))
            {
              int patientID = Convert.ToInt32(pID);
             //Call Stored procedure which will insert this record with this ID
             // to another table
            }    

    }
于 2013-10-09T08:49:44.170 に答える
4

セッション変数を使用してみてください。同じセッションがまだアクティブである限り、後で取得できるセッション変数に GridView を設定できます。

次のコードを使用して、最初のページでセッション変数を設定できます。

Session["gvDoctorList"] = gvDoctorList;

次に、2 ページ目の変数から取得します。

GridView gvDoctorList = (GridView)Session["gvDoctorList"];

セッションの詳細については、MSDN セッション状態の概要を参照してください。

于 2013-10-09T07:59:01.913 に答える
3

Ahmed からの正しいコメントに基づいて 2 番目の回答を追加することにしました。メモリの問題により、セッション変数は実際にはグリッドビューのデータ量を保持するべきではありません。

以下は、あなたがしていると私が想定していることに応じて機能するはずです:

基本的に、行を選択して次のページに移動するときは、その行のデータを新しいページに取得しようとしています。この仮定は正しいですか?その場合、使用できるオプションがいくつかあります。

ここでも、セッション変数を使用して、最初のページで抽出された行のデータを保存できます。

protected void btnformatric_Click(object sender, EventArgs e) {
    if (gvDoctorList.SelectedRow != null) {

        GridViewRow selectedRow = gvDoctorList.SelectedRow;

        Session["PatientId"] = selectedRow.Cells[0].Text;
        Session["firstname"] = selectedRow.Cells[1].Text;
        Session["lastname"] = selectedRow.Cells[2].Text;

        Server.Transfer("Patientstaticformatrix.aspx");
    } else {
        ClientScript.RegisterStartupScript(this.GetType(), "alert", "alert('Please select a row.')", true);
    }
}

基本的に、ここで最初のページにいて、行からデータを取得します。次に、このデータをセッション変数に保存すると、次を使用して次のページからデータを見つけることができます。

protected void Page_Load(object sender, EventArgs e) {
    if (this.Page.PreviousPage != null) {
        //Retrieve values from Session Variables
        Response.Write("PatientId: " + Session["PatientId"].ToString() + "<br />");
        Response.Write("firstname: " + Session["firstname"].ToString() + "<br />");
        Response.Write("lastname: " + Session["lastname"].ToString() + "<br />");
    }
}

クエリ文字列を使用してデータを渡す 2 つ目のオプションもあります。この方法では、を変更する必要があると思いますServer.Transfer("Patientstaticformatrix.aspx");Response.Redirect("Patientstaticformatrix.aspx");

以下は、クエリ文字列の使用例です。

protected void btnformatric_Click(object sender, EventArgs e) {
    if (gvDoctorList.SelectedRow != null) {
        GridViewRow selectedRow = gvDoctorList.SelectedRow;
        //Create URL with Query strings to redirect to new page
        Response.Redirect("Patientstaticformatrix.aspx?parentid=" + selectedRow.Cells[0].Text + "&firstname=" + selectedRow.Cells[1].Text + "&lastname=" + selectedRow.Cells[2].Text);
    } else {
        ClientScript.RegisterStartupScript(this.GetType(), "alert", "alert('Please select a row.')", true);
    }
}

Request.QueryStringそして、2 ページ目のオブジェクトから値を取得します。

protected void Page_Load(object sender, EventArgs e) {
    if (this.Page.PreviousPage != null) {
        //Retrieve values from Query Strings
        Response.Write("PatientId: " + Request.QueryString["parentid"].ToString() + "<br />");
        Response.Write("firstname: " + Request.QueryString["firstname"].ToString() + "<br />");
        Response.Write("lastname: " + Request.QueryString["lastname"].ToString() + "<br />");
    }
}

これらのソリューションはどちらも要件を満たす必要がありますが、どちらもわずかに異なります。このSession Variable解決策は、(機密情報を渡す必要がある場合) 渡されたすべてのデータをユーザーが見ることができなくなるため、おそらく推奨される方法です。クエリ文字列の値は、URL を見ることができる人なら誰でも利用できるためです。

セッション変数とクエリ文字列の詳細については、以下のリソースを参照してください。

ASP.NET セッション状態の概要

Request.QueryString コレクション

于 2013-10-09T09:22:54.210 に答える
0

@Nunners の回答は ownsome ですが、次の方法で試すこともできます。

次のような別のページのページロードイベントフェッチグリッドで:

GridView GridView1 = (GridView)this.Page.PreviousPage.FindControl("GridView1");

すべてのテクニックを以下に示します。

http://www.aspsnippets.com/Articles/Pass-Selected-Row-of-ASPNet-GridView-control-to-another-Page.aspx

上記のドキュメントを参照してください。

于 2013-10-09T08:05:23.350 に答える
0

本当の答えは、別のページに同じグリッドビューを作成する必要があるということです。これは、ある時点でそのページがデータの書き込み/更新/削除を行うため、ASP.NET サイトの 99% がどのように機能するかです。または、同じページを使用するだけです。同じデータを表示するためにリダイレクトする必要はありません。

于 2013-10-09T08:53:08.247 に答える