ASP.NET GridView RowIndex как CommandArgument

Как вы можете получить доступ и отобразить индекс строки элемента gridview в качестве аргумента команды в кнопке столбца поля кнопки?

<gridview>
<Columns>
   <asp:ButtonField  ButtonType = "Button" 
        CommandName = "Edit" Text = "Edit" Visible = "True" 
        CommandArgument = " ? ? ? " />
.....

Попробуй по этой ссылке get-gridview-rowindex-при нажатии кнопки

melaouhia mohamed amine 20.12.2012 14:11
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
55
1
189 680
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

Обычно я связываю эти данные с помощью события 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();
   }
}

Думаю, это сработает.

<gridview>
<Columns>

            <asp:ButtonField  ButtonType = "Button" CommandName = "Edit" Text = "Edit" Visible = "True" CommandArgument = "<%# Container.DataItemIndex %>" />
        </Columns>
</gridview>

это с одинарной кавычкой: CommandArgument = '<% # Container.DataItemIndex%>'

balexandre 23.12.2008 20:07

@balexandre, одинарные кавычки необязательны, если внутри тегов ASP.NET нет двойных кавычек.

AaA 24.05.2012 05:48
void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
    Button b = (Button)e.CommandSource;
    b.CommandArgument = ((GridViewRow)sender).RowIndex.ToString();
}
Ответ принят как подходящий

Вот очень простой способ:

<asp:ButtonField ButtonType = "Button" CommandName = "Edit" Text = "Edit" Visible = "True" 
                 CommandArgument='<%# Container.DataItemIndex %>' />

Для GridView это DataItemIndex, а НЕ ItemIndex. ItemIndex предназначен для ретранслятора

Tawani 12.08.2009 05:06

Я получил сообщение об ошибке «System.Web.UI.WebControls.ButtonField не имеет события DataBinding». когда я пытался. Но для CommandArgument автоматически устанавливается значение rowindex (см. Ответ Rich).

joeriks 15.10.2010 09:49

но он показывает, что индекс ошибки вышел за пределы допустимого диапазона. Должен быть неотрицательным и быть меньше размера коллекции. Имя параметра: индекс в System.Collections.ArrayList.get_Item (индекс Int32) в System.Web.UI.WebControls.GridViewRowCollection.get_Item (индекс Int‌ 32) в Philip.Modules.ItemMapping.ViewItemMapping.gvItem_RowCommandEventAr (объект-отправитель) д)

ranjenanil 05.06.2012 13:06

Когда gridview разрешает разбиение на страницы, это решение не работает. См. Ответ Мохамеда Ахмеда Абдель-Хафеза, Container.DisplayIndex работает точно так же, как значение ButtonField.CommandArgument.

Osvier 20.05.2020 03:53

MSDN говорит, что:

The ButtonField class automatically populates the CommandArgument property with the appropriate index value. For other command buttons, you must manually set the CommandArgument property of the command button. For example, you can set the CommandArgument to <%# Container.DataItemIndex %> when the GridView control has no paging enabled.

Таким образом, вам не нужно устанавливать его вручную. После этого команда строки с GridViewCommandEventArgs сделает ее доступной; например

protected void Whatever_RowCommand( object sender, GridViewCommandEventArgs e )
{
    int rowIndex = Convert.ToInt32( e.CommandArgument );
    ...
}

Ага. Это 5 часов моей жизни, которые я потерял только потому, что не прочитал этот пост сначала.

Daniel Szabo 05.02.2011 06:35

Вот предложение Microsoft для этого http://msdn.microsoft.com/en-us/library/bb907626.aspx#Y800

В gridview добавьте командную кнопку и преобразуйте ее в шаблон, затем дайте ей имя команды в данном случае «Добавить в корзину», а также добавьте 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.

<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

Я не знаю, почему голосование против, Container.DataItemIndex не работает, когда gridview разрешает разбиение на страницы. Это решение работало нормально (точно так же, как значение ButtonField.CommandArgument). +1

Osvier 20.05.2020 03:51

с пейджингом вам нужно сделать некоторые вычисления

int index = Convert.ToInt32(e.CommandArgument) % GridView1.PageSize;

Другие вопросы по теме