Индекс был вне допустимой ошибки в Gridview - PullRequest
3 голосов
/ 21 марта 2011

Я добавляю всю строку CheckBox в мою Gridview помощь с этим 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));
            }
        }

    }

Но когда я это делаю, получаю странную ошибку, подобную этой;

enter image description here

Как мне решить эту проблему?

С наилучшими пожеланиями, Сонер

Ответы [ 2 ]

4 голосов
/ 21 марта 2011

Убедитесь, что в определении 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));
        }
      }
    }
2 голосов
/ 21 марта 2011

Это может быть связано с тем, как вы заполняете свое сеточное представление, или с тем, как вы настраиваете свой GridView для хранения DataKeys, вы можете опубликовать оба кода, где вы устанавливаете свой компонент GridView на своей странице .aspx (html-код) а где ты его заселил?

EDIT:

Я попробовал ваш пример, и единственное отличие состоит в том, что я получаю источник данных из списка, интеад элемента управления DataSource, отлично работает здесь, и я Ctrl + c / Ctrl + v ваш код, так что посмотрите;

публичный класс MyClass { public int productId {get; задавать; } открытая строка MUS_K_ISIM {get; задавать; } }

    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));
                }
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...