Wie können Sie auf den Zeilenindex eines gridview-Elements als Befehlsargument in einer buttonfield-Spalte zugreifen und diese anzeigen?
<gridview>
<Columns>
<asp:ButtonField ButtonType="Button"
CommandName="Edit" Text="Edit" Visible="True"
CommandArgument=" ? ? ? " />
.....
Hier ist ein sehr einfacher Weg:
<asp:ButtonField ButtonType="Button" CommandName="Edit" Text="Edit" Visible="True"
CommandArgument='<%# Container.DataItemIndex %>' />
MSDN sagt folgendes:
Die ButtonField-Klasse füllt die CommandArgument-Eigenschaft automatisch mit dem entsprechenden Indexwert auf. Für andere Befehlsschaltflächen müssen Sie die CommandArgument-Eigenschaft der Befehlsschaltfläche manuell festlegen. Sie können beispielsweise CommandArgument auf <% # Container.DataItemIndex%> setzen, wenn das GridView-Steuerelement kein Paging aktiviert hat.
Sie sollten es also nicht manuell einstellen müssen. Ein Zeilenbefehl mit GridViewCommandEventArgs würde dann darauf zugreifen. z.B.
protected void Whatever_RowCommand( object sender, GridViewCommandEventArgs e )
{
int rowIndex = Convert.ToInt32( e.CommandArgument );
...
}
Hier ist ein Microsoft-Vorschlag für diesen Vorgang http://msdn.Microsoft.com/de-de/library/bb907626.aspx#Y800
Fügen Sie in der Rasteransicht eine Befehlsschaltfläche hinzu und konvertieren Sie sie in eine Vorlage. Geben Sie ihr dann einen Befehlsnamen "AddToCart" und fügen Sie außerdem CommandArgument "<% # ((GridViewRow) Container) %> "
<asp:TemplateField>
<ItemTemplate>
<asp:Button ID="AddButton" runat="server"
CommandName="AddToCart"
CommandArgument="<%# ((GridViewRow) Container).RowIndex %>"
Text="Add to Cart" />
</ItemTemplate>
</asp:TemplateField>
Dann zum Erstellen auf dem RowCommand-Ereignis der gridview identifizieren, wann der Befehl "AddToCart" ausgelöst wird, und tun, was Sie von dort wollen
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "AddToCart")
{
// Retrieve the row index stored in the
// CommandArgument property.
int index = Convert.ToInt32(e.CommandArgument);
// Retrieve the row that contains the button
// from the Rows collection.
GridViewRow row = GridView1.Rows[index];
// Add code here to add the item to the shopping cart.
}
}
** Ein Fehler, den ich gemacht habe, ist, dass ich die Aktionen auf meiner Vorlagenschaltfläche hinzufügen wollte, anstatt sie direkt im RowCommand-Ereignis auszuführen.
Ich denke das wird funktionieren.
<gridview>
<Columns>
<asp:ButtonField ButtonType="Button" CommandName="Edit" Text="Edit" Visible="True" CommandArgument="<%# Container.DataItemIndex %>" />
</Columns>
</gridview>
void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
Button b = (Button)e.CommandSource;
b.CommandArgument = ((GridViewRow)sender).RowIndex.ToString();
}
Ich binde diese Daten normalerweise mit dem RowDatabound-Ereignis mit der GridView:
protected void FormatGridView(object sender, System.Web.UI.WebControls.GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
((Button)e.Row.Cells(0).FindControl("btnSpecial")).CommandArgument = e.Row.RowIndex.ToString();
}
}
<asp:TemplateField HeaderText="" ItemStyle-Width="20%" HeaderStyle-HorizontalAlign="Center">
<ItemTemplate>
<asp:LinkButton runat="server" ID="lnkAdd" Text="Add" CommandName="Add" CommandArgument='<%# Eval("EmpID"))%>' />
</ItemTemplate>
</asp:TemplateField>
Dies ist der traditionelle Weg und die neueste Version von asp.net Framework mit stark typisierten Daten, und Sie müssen keine Zeichenfolge wie "EMPID" verwenden.