2012-09-24 4 views
2

D'abord, je choisissais tous les enregistrements à la page vide comme ceci:Pas en mesure d'effacer les dernières données source de GridView

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(); 
} 

Dans GridView (gvTemp), je passe MemID dans CommandArgument comme ceci:

<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> 

Alors, quand je clique sur Start, gvTemp_RowCommand est tiré et je veux obtenir CommandArgument (MemID). Donc, je le fais pour y parvenir:

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

Ce travail bien. Mais le problème est ici.
Lorsque la recherche d'utilisateur pour un enregistrement particulier, je reload gvTemp comme ceci:

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(); 
} 

L'exécution de cette requête, je reçois un seul enregistrement. Et quand je clique sur Start, gvTemp_RowCommand est tiré. Mais je reçois e.CommandArgument de l'ancienne DataSource. (c'est-à-dire le top 1 MemID de SELECT * FROM MyTable). Donc, avant de se lier DataSource réelle effacer le GridView comme ceci:

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

Mais je reçois e.CommandArgument de vieux DataSource. Alors qu'est-ce qui me manque? Ou existe-t-il une méthode alternative pour atteindre la même chose?

+0

Quelle est la valeur de 'myParam' que vous passez dans' objCmd.Parameters.Add (myParam); '? – prashanth

+0

try Refresh() ou .ResetBindings peut-il résoudre –

+0

@prashanth Je reçois la valeur de la méthode arguments. – hims056

Répondre

3

Sur chaque bouton cliquez sur un postback se produit et l'événement de chargement de page se produit donc dans votre cas cela pourrait être la raison pour laquelle la source de données précédente est en cours de chargement. vous devez donc vérifier la condition IsPostBack.

Essayez quelque chose comme ceci:

if(!IsPostBack) 
    //Your code or method for selecting all records. 
0

Pourquoi vous simplement enlever pas les Response.Redirect(itself) et les méthodes d'utilisation et les propriétés à la place?

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(); 
    } 
} 
+0

En fait, 'AddMem.aspx' est une autre page. Où je veux passer 'MemID' – hims056

Questions connexes