Comment puis-je ajouter un programme à un bouton gridview et lui attribuer une fonction code-behind spécifique?

StackOverflow https://stackoverflow.com/questions/2418379

Question

Dans l'exécution je crée un DataTable et en utilisant imbriqué pour boucles pour remplir la table. Ce tableau j'assigner plus tard comme DataSource à un gridview et RowDataBound j'affecter la valeur de chaque cellule. Je veux savoir comment je peux donner à chaque cellule un bouton et d'attribuer ce bouton à une fonction codebehind. Je vais avoir 12 boutons et chacun contiendra une valeur différente. Je préférerais qu'ils se réclament tous la même fonction avec une sorte d'événement qui stocke la valeur spécifique à la cellule.

Ceci est le code où la table est créée:

protected void GridViewDice_RowDataBound(object sender, GridViewRowEventArgs e)
{


    DataTable diceTable = _gm.GetDice(_gameId);
    for (int i = 0; i < GameRules.ColumnsOfDice; i++)
    {
        if(e.Row.RowIndex > -1)
        {
            /*This is where I'd like to add the button*/
            //e.Row.Cells[i].Controls.Add(new Button);
            //e.Row.Cells[i].Controls[0].Text = specific value from below

            //This is where the specific value gets input
            e.Row.Cells[i].Text = diceTable.Rows[e.Row.RowIndex][i].ToString();
        }

    }
}

Je voudrais gérer la ButtonClick avec quelque chose comme ceci:

protected void DiceButton_Click(int column, int row, int value)
{
    //Do whatever
}

Toutes les suggestions?

Était-ce utile?

La solution

Sur votre gridview dans le balisage, attribuer CommandArgument attribut à celui que vous voulez (ici je choisis l'index de la GridViewRow actuelle) à l'intérieur des vos boutons.

 <asp:Button ID="lbnView" runat="server" Text="Button" OnClick="btn_Clicked" 
CommandArgument="<%# ((GridViewRow)Container).RowIndex %>"></asp:Button>

Ou dans votre code derrière, vous pouvez créer un bouton comme ci-dessous

protected void GridViewDice_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 


    DataTable diceTable = _gm.GetDice(_gameId); 
    for (int i = 0; i < GameRules.ColumnsOfDice; i++) 
    { 
        if(e.Row.RowIndex > -1) 
        { 
            Button btn = new Button();
            btn.CommandArgument = diceTable.Rows[e.Row.RowIndex][i].ToString(); 
            btn.Attributes.Add("OnClick", "btn_Clicked");

            e.Row.Cells[i].Controls.Add(btn);
        }
    }
}

puis faire un gestionnaire d'événements comme ci-dessous

protected void btn_Clicked(object sender, EventAgrs e)
{
   //get your command argument from the button here
   if (sender is Button)
   {
     try
     {
        String yourAssignedValue = ((Button)sender).CommandArgument;
     }
     catch
     {
       //Check for exception
     }
   }
}

Autres conseils

Malheureusement, à ce stade, vous ne pouvez pas créer un nouveau bouton et affecter des événements à elle. À ce stade du cycle de vie de la page, quand il est des événements de tir, il a déjà construit sa liste des contrôles « connus » qu'il gardera une trace de quand la page se recharge, et il ne saura pas tirer sur le bouton cliquez sur le code de l'événement la prochaine fois que la publication sur.

Afin d'obtenir ASP.NET pour bien tirer vos méthodes d'événement, vous devez ajouter le contrôle Button à la hiérarchie de contrôle de la page avant l'événement Load de la page. Je le fais habituellement dans la méthode d'événement Init ou CreateChildControls.

Pour résoudre votre problème, je recommande d'ajouter le bouton à toutes les cellules dans le balisage de modèle et de le faire référence au gestionnaire d'événements là-bas. Ensuite, demandez à votre méthode RowDataBound gérer retourner la visibilité du bouton ou désactiver.

La meilleure façon de le faire est d'ajouter simplement une colonne à votre GridView (Vous pouvez utiliser un bouton plutôt que d'un lien hypertexte si vous le souhaitez):

<Columns>
 <asp:HyperLinkField DataNavigateUrlFields="ID" DataNavigateUrlFormatString="~/pUser.aspx?field={0}" HeaderText="Select" Text="Select" />

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top