【问题标题】:Index was out of range error in GridviewGridview 中的索引超出范围错误
【发布时间】:2011-03-21 18:02:20
【问题描述】:

我在Gridview 中添加了所有行CheckBox,以帮助解决此问题article

这是我的Calculate Button 代码;

protected void Calculate_Click(object sender, EventArgs e)
    {
        bool atLeastOneRowDeleted = false; 

        foreach (GridViewRow row in GridView1.Rows) 
        { 
            CheckBox cb = (CheckBox)row.FindControl("ProductSelector"); 
            if (cb != null && cb.Checked)
            { 
                atLeastOneRowDeleted = true; 
                int productID = Convert.ToInt32(GridView1.DataKeys[row.RowIndex].Value); 
                Response.Write(string.Format( "This would have deleted ProductID {0}<br />", productID));
            }
        }

    }

但是当我这样做时,会出现这样的奇怪错误;

我该如何解决这个问题?

最好的问候,Soner

【问题讨论】:

  • 您是否使用调试器查看过 DataKeys 集合?
  • @Thomas Are CheckBox 应该是导致此错误的原因吗?
  • 你到底想用上面的代码实现什么?
  • @gbs 我只想用这段代码写出在 Gridview 中选择的哪一行。 Response.Write(string.Format("这将删除 ProductID {0}
    ", productID));
  • 您能否使用您的 GV 标记和数据源详细信息更新您的问题。

标签: c# .net asp.net gridview


【解决方案1】:

确保您在 GridView 定义中定义了 DataKeys

  <asp:gridview id="GridView2" 
        datakeynames="productID"
        ...
        ...>
    enter code here

   </asp:gridview>

还可以尝试像这样添加对 DataRow 的检查

    foreach (GridViewRow row in GridView1.Rows) 
    {
      if(row.RowType == DataControlRowType.DataRow)
      { 
        CheckBox cb = (CheckBox)row.FindControl("ProductSelector"); 
        if (cb != null && cb.Checked)
        { 
            atLeastOneRowDeleted = true; 
            int productID = Convert.ToInt32(GridView1.DataKeys[row.RowIndex].Value); 
            Response.Write(string.Format( "This would have deleted ProductID {0}<br />", productID));
        }
      }
    }

【讨论】:

  • @StackOwerflowException 抱歉,您的代码出现此错误。 i.imgur.com/blGqw.png
  • @Soner 查看我的编辑!你可以为 Gridview 发布你的标记吗?
  • 但我没有 productID 列。这只是 CheckBoxes 列。所以当我写这个
  • 尝试 MUS_K_ISIM 使用 datakeysnames 而不是 productID
  • 我只有两列“MUS_K_ISIM”和 CheckBoxes 列。 i.imgur.com/ArKi9.png
【解决方案2】:

这可能与您填充 gridview 的方式或设置 GridView 以存储 DataKeys 的方式有关,您能否发布两个代码,在 .aspx 页面上设置 GridView 组件(html 代码)你在哪里填充它?

编辑:

我试过你的例子,唯一的区别是我从一个数据源控件的列表中获取一个数据源,在这里运行完美,我 Ctrl+c/Ctrl+v 你的代码,所以看看;

公开课 MyClass { 公共 int productId { 获取;放; } 公共字符串 MUS_K_ISIM { 获取;放; } }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            List<MyClass> ChechkBoxDataSource = new List<MyClass>();
            ChechkBoxDataSource.Add(new MyClass() { productId = 1, MUS_K_ISIM = "Stack" });
            ChechkBoxDataSource.Add(new MyClass() { productId = 2, MUS_K_ISIM = "Overflow" });
            ChechkBoxDataSource.Add(new MyClass() { productId = 3, MUS_K_ISIM = "Example" });

            GridView1.DataSource = ChechkBoxDataSource;
            GridView1.DataBind();
        }
    }

    protected void Unnamed1_Click(object sender, EventArgs e)
    {
        foreach (GridViewRow row in GridView1.Rows)
        {
            if (row.RowType == DataControlRowType.DataRow)
            {
                CheckBox cb = (CheckBox)row.FindControl("ProductSelector");
                if (cb != null && cb.Checked)
                {
                    int productID = Convert.ToInt32(GridView1.DataKeys[row.RowIndex].Value);
                    Response.Write(string.Format("This would have deleted ProductID {0}<br />", productID));
                }
            }
        }
    }

【讨论】:

  • 这是我的 gridview 代码。 itemtemplate>
  • @Soner 要使这种方法起作用,您应该有一个包含您的 productId 的属性,就像上面的示例一样,我在其中定义了一个 int 属性来在 MyClass 中表示它。否则,您应该创建它或查找其他字段以唯一标识您的对象。
猜你喜欢
  • 1970-01-01
  • 2013-02-26
  • 1970-01-01
  • 2016-07-28
  • 1970-01-01
  • 2016-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多