nar86 Ответов: 2

Указанное приведение недопустимо


на первой странице будут показаны пять записей, а на второй странице-еще пять записей.

предположим, что на первой странице Я проверяю две строки, а на второй странице Я проверяю еще две строки означает, что выбранные строки флажка должны быть обновлены в [transact].[transaction_item] в таблице.



protected void Page_Load(object sender, EventArgs e)
        {
           if (!IsPostBack)
                {
                     BindData();
                }
       }


 protected void BindData()
        {
             String strConnString = ConfigurationManager.ConnectionStrings["ConnectionStrings"].ConnectionString;
                SqlConnection con = new SqlConnection(strConnString);
                SqlCommand cmd = new SqlCommand("select * from [transact].[transaction_item] where status = 'new'", con);
                con.Open();
                SqlDataAdapter da = new SqlDataAdapter();
                DataSet ds = new DataSet();
                da.SelectCommand = cmd;
                da.Fill(ds);
                grdRpt.DataSource = ds;
                grdRpt.DataBind();
        }


 protected void grdRpt_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            SaveCheckedValues();
            grdRpt.PageIndex = e.NewPageIndex;
            BindData();
            PopulateCheckedValues();
        }


private void PopulateCheckedValues()
        {
            System.Collections.ArrayList userdetails = (System.Collections.ArrayList)Session["CHECKED_ITEMS"];
            if (userdetails != null && userdetails.Count > 0)
            {
                foreach (GridViewRow gvrow in grdRpt.Rows)
                {
                    int index = (int)grdRpt.DataKeys[gvrow.RowIndex].Value;
                    if (userdetails.Contains(index))
                    {
                        CheckBox myCheckBox = (CheckBox)gvrow.FindControl("chkselecdata");
                        myCheckBox.Checked = true;
                    }
                }
            }
        }

   private void SaveCheckedValues()
        {
            System.Collections.ArrayList userdetails = new System.Collections.ArrayList();
            int index = -1;
            foreach (GridViewRow gvrow in grdRpt.Rows)
            {
                index = (int)grdRpt.DataKeys[gvrow.RowIndex].Value;
                bool result = ((CheckBox)gvrow.FindControl("chkselecdata")).Checked;

               
                if (Session["CHECKED_ITEMS"] != null)
                    userdetails = (System.Collections.ArrayList)Session["CHECKED_ITEMS"];
                if (result)
                {
                    if (!userdetails.Contains(index))
                        userdetails.Add(index);
                }
                else
                    userdetails.Remove(index);
            }
            if (userdetails != null && userdetails.Count > 0)
                Session["CHECKED_ITEMS"] = userdetails;
        }


когда я запускаю приведенный выше код показывает ошибку следующим образом
указанное приведение недопустимо

Приведенная выше ошибка отображается в следующей строке следующим образом
index = (int)grdRpt.DataKeys[gvrow.Параметр rowindex].Значение;

как исправить эту ошибку.

Что я уже пробовал:

См. выше...

2 Ответов

Рейтинг:
9

OriginalGriff

Цитата:
указанное приведение недопустимо

Приведенная выше ошибка отображается в следующей строке следующим образом
index = (int)grdRpt.DataKeys[gvrow.RowIndex].Value;

Вы не можете, или, по крайней мере, не можете напрямую.
Сообщение об ошибке довольно ясно: Вы не можете привести данные в этой ячейке к целому числу. Это означает, что данные не являются целым числом - у нас нет доступа к вашим данным, поэтому мы не можем точно сказать, что вы получаете. Начните с "разрыва" линии:
object o = grdRpt.DataKeys[gvrow.RowIndex].Value;
index = (int) o;
и используйте отладчик, чтобы посмотреть, что именно вы получаете из сетки. Это должно начать давать вам ключ к пониманию того, где находится проблема: данные, код, сетка ...

Но мы не можем сделать это за вас - у нас нет доступа к вашим данным или к вашему коду, пока он работает!


Рейтинг:
0

Manish K. Agarwal

попробуйте int.Parse((string)grdRpt.DataKeys[gvrow.Параметр rowindex].Значение)


nar86

я пытаюсь это сделать, но ошибка отображается в следующей строке:

частный недействительными SaveCheckedValues()
{
Система.Коллекции.ArrayList userdetails = новая система.Коллекции.список ArrayList();
индекс int = -1;
по каждому элементу (gvrow GridViewRow в grdRpt.Строк)
{
int.Parse((string)grdRpt.DataKeys[gvrow.Параметр rowindex].Значение);

bool result = ((CheckBox)gvrow.FindControl("chkselecdata")).Проверен;

// Регистрация в сеансе
if (Session["CHECKED_ITEMS"] != null)
userdetails = (System.Коллекции.ArrayList)сессия["CHECKED_ITEMS"];
если (результат)
{
if (!userdetails.Содержит(индекс))
userdetails.Добавить(индекс);
}
еще
userdetails.Удалить(индекс);
}
if (userdetails != null && userdetails.Count > 0)
Session["CHECKED_ITEMS"] = userdetails;
}


когда я запускаю приведенный выше код показывает ошибку следующим образом

"Невозможно привести объект типа" система.DBNull' to type 'система.Строка

Ошибка отображается в следующей строке следующим образом

int.Parse((string)grdRpt.DataKeys[gvrow.Параметр rowindex].Значение);

как решить эту ошибку, пожалуйста, помогите мне.

Manish K. Agarwal

пожалуйста обратитесь к нам https://stackoverflow.com/questions/21277969/getting-datakey-value-for-each-row-in-grid-view