Wie kann ich programmatisch auf eine Schaltfläche zu einer Gridview und Zuweisen zu einer bestimmten Code-Behind-Funktion?

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

Frage

In der Laufzeit bin ich Erstellen einer Datentabelle und mit verschachtelten for-Schleifen, die Tabelle zu füllen. Diese Tabelle I zuweisen später als Datasource zu einer Gridview und auf RowDataBound ich den Wert jeder Zelle zuweisen. Ich möchte wissen, wie ich jeder Zelle einen Knopf geben kann und auf diese Schaltfläche, um eine Code-Behind-Funktion zuweisen. Ich werde 12 Tasten hat und jeder wird einen anderen Wert enthält. Ich würde es vorziehen, wenn sie alle die gleiche Funktion mit irgendeiner Art von Ereignis aufrufen, die die zellspezifische Wert speichert.

Dies ist der Code, in dem die Tabelle erstellt wird:

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

    }
}

Ich möchte die Button mit so etwas wie das zu handhaben:

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

Irgendwelche Vorschläge?

War es hilfreich?

Lösung

Auf Ihrem gridview in Markup zuweisen Command Attribut auf welche auch immer Sie wollen (hier wähle ich den Index des aktuellen GridViewRow) innerhalb der Ihren Tasten.

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

oder in Ihrem Code hinter, können Sie eine Taste wie unten

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

dann ein Event-Handler wie unten machen

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

Andere Tipps

Leider in diesem Stadium kann man nicht eine neue Schaltfläche und weist Ereignisse es schaffen. Durch diesen Punkt auf der Seite Lebenszyklus, wenn es Ereignisse feuert, hat er bereits gebaut es in der Liste der „bekannten“ steuert, dass sie den Überblick über, wenn die Seite neu geladen zu halten, und so wird es nicht wissen, dass Ihr Button-Klick-Ereigniscode abzuzufeuern das nächste Mal Pfosten zurück.

Um ASP.NET zu erhalten, um richtig Ihre Veranstaltung Methoden zu feuern, müssen Sie den Button Kontrolle der Kontrolle der Seitenhierarchie hinzuzufügen, bevor Load-Ereignis der Seite. Ich mache es in der Regel in dem Init-Ereignis oder Create Methode.

Ihr Problem zu lösen, würde ich empfehlen die Taste, um alle Zellen in der Vorlage Markup zugab und haben den Event-Handler es verweisen. Dann haben Sie Ihre RowDataBound Methode der Schaltfläche Sichtbarkeit ein- oder ausgeschaltet Griff drehen.

Der einfachste Weg, dies zu tun, ist nur eine Spalte zu Ihrem Gridview hinzufügen (können Sie eine Taste verwenden, anstatt ein Hyperlink, wenn Sie mögen):

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top