Ответ 1
Вот очень простой способ:
<asp:ButtonField ButtonType="Button" CommandName="Edit" Text="Edit" Visible="True"
CommandArgument='<%# Container.DataItemIndex %>' />
Как вы можете получить доступ и отобразить индекс строки элемента gridview в качестве аргумента команды в кнопке столбца кнопки?
<gridview>
<Columns>
<asp:ButtonField ButtonType="Button"
CommandName="Edit" Text="Edit" Visible="True"
CommandArgument=" ? ? ? " />
.....
Вот очень простой способ:
<asp:ButtonField ButtonType="Button" CommandName="Edit" Text="Edit" Visible="True"
CommandArgument='<%# Container.DataItemIndex %>' />
MSDN говорит, что:
Класс ButtonField автоматически заполняет свойство CommandArgument соответствующим значением индекса. Для других командных кнопок вы должны вручную установить свойство CommandArgument командной кнопки. Например, вы можете установить CommandArgument в <% # Container.DataItemIndex% > , когда элемент управления GridView не имеет пейджинга.
Поэтому вам не нужно устанавливать его вручную. Затем команда row с GridViewCommandEventArgs сделает ее доступной; например.
protected void Whatever_RowCommand( object sender, GridViewCommandEventArgs e )
{
int rowIndex = Convert.ToInt32( e.CommandArgument );
...
}
Вот предложение Microsoft для этого http://msdn.microsoft.com/en-us/library/bb907626.aspx#Y800
В gridview добавьте командную кнопку и преобразуйте ее в шаблон, а затем дайте ей имя команды в этом случае " AddToCart", а также добавьте CommandArgument "<% # ((GridViewRow ) Контейнер).RowIndex% > "
<asp:TemplateField>
<ItemTemplate>
<asp:Button ID="AddButton" runat="server"
CommandName="AddToCart"
CommandArgument="<%# ((GridViewRow) Container).RowIndex %>"
Text="Add to Cart" />
</ItemTemplate>
</asp:TemplateField>
Затем для создания в событии RowCommand gridview укажите, когда запускается команда "AddToCart", и делайте то, что вы хотите оттуда
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.
}
}
** Одна ошибка, которую я делал, заключается в том, что я хотел добавить действия на кнопку шаблона вместо того, чтобы делать это непосредственно на событии RowCommand.
Я думаю, что это сработает.
<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();
}
Я обычно связываю эти данные с помощью события RowDatabound с 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>
Это традиционный способ и последняя версия инфраструктуры asp.net с строго типизированными данными, и вам не нужно использовать в качестве строки, например, "EMPID"
<asp:LinkButton ID="LnkBtn" runat="server" Text="Text" RowIndex='<%# Container.DisplayIndex %>' CommandArgument='<%# Eval("??") %>' OnClick="LnkBtn_Click" />
внутри обработчика событий:
Protected Sub LnkBtn_Click(ByVal sender As Object, ByVal e As EventArgs)
dim rowIndex as integer = sender.Attributes("RowIndex")
'Here you can use also the command argument for any other value.
End Sub