من مشکلم رو حل کردم. اتفاقا مشکل دقیقا مربوط به همین قسمت هست و هیچ ربطی به جاهای دیگه ندارم. حالا اینجا کاملا توضیح می دم که دوستان استفاده کنن
قضیه اینه که وقتی ما index رو با کد e.commandargument می گیریم این index در واقع واسه کنترل grid نیست و برای datasource هستش. به خاطر همین وقتی وارد page 2 می شیم index بزرگتر از paging گرید میشه. مثلا اگه paging شما 8تایی باشه تو صفحه دوم ایندکس از 9 شروع می شه و کنترل گرید دیگه اینو نمی تونه واسه datasource ترجمه کنه. راه حلش هم اینه:
اول تو event : page index changing این دستور رو می نویسیم:
protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
GridView1.PageIndex = e.NewPageIndex;
}
با این کد به گرید می فهمونیم که از این به بعد هرجی index بهت دادیم رو تو صفحه جدید محاسبه کن
بعدش زمانی که می خوایم index رو بهشت بدیم یه شرط می زاریم که اگه index بزرگتر از paging ما بود اونو از paging کم کنه تا ایندکس صفحه جدید بدست بیاد.
یعنی کد قبلی اینجوری تغییر می کنه:
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
MCalendar mc = new MCalendar();
DateTime dt = new DateTime();
int index = Convert.ToInt32(e.CommandArgument);
index = (index > 8) ? index - 8 : index;
Label lblId = (Label)GridView1.Rows[index].FindControl("lbl_id");
Label lblSold = (Label)GridView1.Rows[index].FindControl("lblSold");
dt = DateTime.Now;
string itemName = string.Format("{0}{1:HHmmss}", mc.PersianDate.GetDate().ToString(), dt);
if (e.CommandName == "Update")
{
SqlDataSource1.UpdateCommand = "UPDATE [file] SET [up_date] = '" +
itemName + "' WHERE [id] = '" + lblId.Text + "'";
SqlDataSource1.Update();
}
else if (e.CommandName == "Sale")
{
if (lblSold.Text == "0")
{
SqlDataSource1.UpdateCommand = "UPDATE [file] SET [sold] = 1 WHERE [id] = '" + lblId.Text + "'";
}
else
{
SqlDataSource1.UpdateCommand = "UPDATE [file] SET [sold] = 0 WHERE [id] = '" + lblId.Text + "'";
}
SqlDataSource1.Update();
}
}
فرق این کد با کد قبلی همون شرطی هست که میشه اگه index>8 شد اون منهای 8 کن.
اینجوری این مشکل حل میشه