2

まず、次のようにページ読み込み時にすべてのレコードを選択します。

OleDbCommand objCmd = new OleDbCommand("SELECT * FROM MyTable", mycon);
objCmd.CommandType = CommandType.Text;
DataTable dtTemp = new DataTable();
OleDbDataReader rd = objCommand.ExecuteReader();
if (rd.HasRows)
{
    dtTemp.Load(rd);
    gvTemp.DataSource = dtTemp;
    gvTemp.DataBind();
}

GridView( )では、次のようgvTempに渡します。MemIDCommandArgument

<asp:TemplateField HeaderText="Action" ItemStyle-Width="80px">
    <ItemTemplate>
        <asp:LinkButton ID="lbtnStart" runat="server" CommandArgument='<%# Eval("MemID") %>' CommandName="Start">Start</asp:LinkButton>
    </ItemTemplate>
</asp:TemplateField>

したがって、をクリックするとStart、が起動され、 ( )gvTemp_RowCommandを取得したいと思います。だから私はそれを達成するためにこれをやっています:CommandArgumentMemID

protected void gvTemp_RowCommand(object sender, GridViewCommandEventArgs e)
{
    if (e.CommandName == "Start")
    {
        Response.Redirect("AddMem.aspx?MemID=" + e.CommandArgument.ToString());
    }
}

これは問題なく動作します。しかし、問題はここにあります。
ユーザーが特定のレコードを検索すると、次のgvTempようにリロードします。

OleDbCommand objCmd = new OleDbCommand("SELECT * FROM MyTable WHERE MemID = ?", mycon);
objCmd.Parameters.Add(myParam); 
objCmd.CommandType = CommandType.Text;
DataTable dtTemp = new DataTable();
OleDbDataReader rd = objCommand.ExecuteReader();
if (rd.HasRows)
{
    dtTemp.Load(rd);
    gvTemp.DataSource = dtTemp;
    gvTemp.DataBind();
}

このクエリを実行すると、レコードが1つだけ取得されます。そして、私がクリックするとStartgvTemp_RowCommand解雇されます。しかし、私はe.CommandArgument古いデータソースを取得しています。(つまり、のトップ1 MemIDSELECT * FROM MyTable。したがって、実際のデータソースをバインドする前に、次のようにGridViewをクリアします。

gvTemp.DataSource = null;
gvTemp.DataBind();
gvTemp.DataSource = dtTemp;
gvTemp.DataBind();

しかし、それでも私はe.CommandArgument古いデータソースを入手しています。だから私は何が欠けていますか?または、同じことを達成するための代替方法はありますか?

4

2 に答える 2

3

ボタンをクリックするたびにポストバックが発生し、ページの読み込みイベントが発生するため、この場合、これが以前のデータソースが読み込まれる理由である可能性があります。したがって、IsPostBack条件を確認する必要があります。

次のようなものを試してください。

if(!IsPostBack)
   //Your code or method for selecting all records.
于 2012-09-24T06:12:57.857 に答える
0

Response.Redirect(itself)単純に削除して、代わりにメソッドとプロパティを使用してみませんか?

private string MemID{
    get { return (String)ViewState["MemID"]; }
    set { ViewState["MemID"] = value; }
}

private void BindGrid()
{
    // copy your sql,datasource and databind stuff here, use the MemID property for the parameter
}

protected void gvTemp_RowCommand(object sender, GridViewCommandEventArgs e)
{
    if (e.CommandName == "Start")
    {
        MemID = e.CommandArgument.ToString());
        BindGrid();
    }
}
于 2012-09-24T06:18:08.703 に答える