0

我正在尝试创建嵌套评论。下面的代码给了我索引超出范围。必须是非负数且小于集合的大小。参数名称:索引

protected void GridViewRowCommand(Object sender, GridViewCommandEventArgs e)
{
    var scrapId = Int32.Parse(e.CommandArgument.ToString());
    switch (e.CommandName)
    { 
        case "comment":
            int index = Convert.ToInt32(e.CommandArgument);
            GridViewRow gvRow = GridViewUserScraps.Rows[index];
            TextBox txtcomment = (TextBox)GridViewUserScraps.Rows[index].FindControl("txtcomment");

            string postcomment = "Insert INTO comment (FromId,ToId,PostId,CommentMsg) VALUES('" + Session["UserId"].ToString() + "','" + Request.QueryString["Id"].ToString() + "','" + scrapId + "','"+txtcomment.Text+"')";
            dbClass.ConnectDataBaseToInsert(postcomment);

            break;
    }
}

数据键名是 ..DataKeyNames="ScrapId"

我想传递与我单击发布的按钮位于同一行的文本框的值。

按钮:

<asp:Button ID="Button1" runat="server" Text="Comment" CommandName="comment" 
                                        CommandArgument='<%# Eval("ScrapId")%>' />
4

1 回答 1

2

尝试获取行索引,例如:

GridViewRow gvr = (GridViewRow)(((Button)e.CommandSource).NamingContainer);
int index = gvr.RowIndex;

通常commandArgument,默认情况下包含 rowIndex,但在您的情况下,您将在标签中覆盖它,使用Eval("ScrapId").

e是一个对象,其中包含有关已触发事件的信息。ComandSource是触发事件的源控件,在您的情况下是 Button,因此我们将其转换为 Button。然后,我们有NamingContainer, 即包装您的 Button 的服务器控件,在本例中为GridViewRow.

使用GridViewRow,我们可以在事件发生时直接访问活动行,并且我们有更多关于该行的数据,包括当前RowIndex

于 2013-03-22T13:34:59.640 回答