it-swarm.com.de

ASP.NET GridView RowIndex As CommandArgument

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=" ? ? ? " />
.....
55
mirezus

Hier ist ein sehr einfacher Weg:

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

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 );
    ...
}
35
Rich

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.

12
Cesar Duran

Ich denke das wird funktionieren.

<gridview>
<Columns>

            <asp:ButtonField  ButtonType="Button" CommandName="Edit" Text="Edit" Visible="True" CommandArgument="<%# Container.DataItemIndex %>" />
        </Columns>
</gridview>
5
void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
    Button b = (Button)e.CommandSource;
    b.CommandArgument = ((GridViewRow)sender).RowIndex.ToString();
}
1
fARcRY

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();
   }
}
0
Dillie-O
<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.

0
Bala