まず、次のようにページ読み込み時にすべてのレコードを選択します。
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
に渡します。MemID
CommandArgument
<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
を取得したいと思います。だから私はそれを達成するためにこれをやっています:CommandArgument
MemID
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つだけ取得されます。そして、私がクリックするとStart
、gvTemp_RowCommand
解雇されます。しかし、私はe.CommandArgument
古いデータソースを取得しています。(つまり、のトップ1 MemID
)SELECT * FROM MyTable
。したがって、実際のデータソースをバインドする前に、次のようにGridViewをクリアします。
gvTemp.DataSource = null;
gvTemp.DataBind();
gvTemp.DataSource = dtTemp;
gvTemp.DataBind();
しかし、それでも私はe.CommandArgument
古いデータソースを入手しています。だから私は何が欠けていますか?または、同じことを達成するための代替方法はありますか?