عمل نکردن دکمه در gridview
سلام
من چندتا دکمه تو girview دارم که command name اونهارو خودم تعریف کردم و براشون کد نوشتم. یعنی از دکمه های آماده خود grid نیست. ولی مشکل الان اینه که این دکمه ها تو صفحه اول گرید خوب کار می کنن ولی وقتی گرید میره تو صفحه دوم دیگه دکمه ها کار نمی کنن. مشکل کجاست؟
ممنون
نقل قول: عمل نکردن دکمه در gridview
نقل قول: عمل نکردن دکمه در gridview
لطفا کدهاتون بگذارید تا باهم بررسی کنیم .
نقل قول: عمل نکردن دکمه در gridview
بفرمایین اینم کد
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
MCalendar mc = new MCalendar();
DateTime dt = new DateTime();
int index = Convert.ToInt32(e.CommandArgument);
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();
}
}
نقل قول: عمل نکردن دکمه در gridview
ببین وقتی میگی میره صفح دوم دکمه ها کار نمیکنه یعنی اون کویری گرید یه بار بیشتر اجرا نمیشه تعداد اطلاعات بیار.اگه بتونی یه تریس کونی مشکلت می تونی حل کنی فقط تریس کن ببین کجا مشکل داری در غیر اینصورت یه پروژه کوچیک درست کن بزار تو سایت
نقل قول: عمل نکردن دکمه در gridview
من قبلا همه این کارارو کردم که حالا اومدم اینجا سوال کردم دیگه. فکرم نکنم دیگه لازم باشه که یه پروژه کوچیک درست کنم بزارم اینجا چون فقط تو این تیکه کد مشکل دارم که اونم کامل گذاشتم. من فقط می خوام ببینم این یه مشکل معمول تو گرید هست و راه حل داره یا نه فقط واسه من پیش اومده.
نقل قول: عمل نکردن دکمه در gridview
break point بذارید ببینیم کد تا چه مرحله ای اجرل میشه.
نقل قول: عمل نکردن دکمه در gridview
نقل قول:
نوشته شده توسط
morika
من قبلا همه این کارارو کردم که حالا اومدم اینجا سوال کردم دیگه. فکرم نکنم دیگه لازم باشه که یه پروژه کوچیک درست کنم بزارم اینجا چون فقط تو این تیکه کد مشکل دارم که اونم کامل گذاشتم. من فقط می خوام ببینم این یه مشکل معمول تو گرید هست و راه حل داره یا نه فقط واسه من پیش اومده.
دقیقا این مشکل که شما میگی برای منم اتفاق افتاده شما یه تیککه کد گذاشتی میگی مشکل اینه . من قول بهتون میدم مشکل تنها این نیست چون کد شما کاری نمیکنه-
شما دگمه آپدیت گذاشتی صفحاه دوم که میره کار نمیکنه مشکل شما همن دیگه.شما میتونی همون صفحه فقط این بزاری
نقل قول: عمل نکردن دکمه در gridview
من مشکلم رو حل کردم. اتفاقا مشکل دقیقا مربوط به همین قسمت هست و هیچ ربطی به جاهای دیگه ندارم. حالا اینجا کاملا توضیح می دم که دوستان استفاده کنن
قضیه اینه که وقتی ما 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 کن.
اینجوری این مشکل حل میشه
نقل قول: عمل نکردن دکمه در gridview
خوب خدا رو شکر مشکلتون حل شد.
تمامی دوستان که پست گذاشتن قصد کمک به شما داشتن .ولی شما هم توقع نداشته باشه با یه تیکه کد براتون معجزه کنند اگه شما هم مشکلتون فهمیدی حتما با تریس کردن بود . حالا دوستان به یه تیکه .کد .........
اگه گفتم برنامه کوچیک درست کن بزار میخاستم تو سیستم خود براتون مشکل حل کنم که خودتون استاد بنده هستین مشکلتون حل کردین...
نقل قول: عمل نکردن دکمه در gridview
سلام
نقل قول:
اتفاقا مشکل دقیقا مربوط به همین قسمت هست و هیچ ربطی به جاهای دیگه ندارم
اتفاقا مشکل اصلا به این قسمت ارتباطی نداره. (اصلا مشکلی نیست. بیشتر برداشت اشتباه شماس)
نقل قول:
قضیه اینه که وقتی ما index رو با کد e.commandargument می گیریم این index در واقع واسه کنترل grid نیست و برای datasource هستش
همیشه اینطوری نیست. به خاطر همین گفتم برداشت اشتباه
نقل قول:
اول تو event : page index changing این دستور رو می نویسیم:
protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
GridView1.PageIndex = e.NewPageIndex;
}
با این کد به گرید می فهمونیم که از این به بعد هرجی index بهت دادیم رو تو صفحه جدید محاسبه کن
هر وقت خواستید گرید رو صفحه بندی کنید این تیکه کد رو باید بنویسید (شماره صفحه رو برای گرید مشخص میکنه) و این اصلا ارتباطی به موضوع نداره
نقل قول:
بعدش زمانی که می خوایم index رو بهشت بدیم یه شرط می زاریم که اگه index بزرگتر از paging ما بود اونو از paging کم کنه تا ایندکس صفحه جدید بدست بیاد.
نکنی این کارو یه وقت. چه کاریه آخه. کد پایین رو ببین
کد HTML:
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" OnRowCommand="GridView1_RowCommand" AllowPaging="True" PageSize="4" OnPageIndexChanging="GridView1_PageIndexChanging" DataKeyNames="Id" DataSourceID="SqlDataSource1" EnableModelValidation="True">
<Columns>
<asp:ButtonField CommandName ="deleteCommand" HeaderText="حذف" ButtonType="Button" Text="حذف" />
<asp:TemplateField HeaderText="حذف">
<ItemTemplate>
<asp:Button ID="Button1" runat="server" Text='<%# ((GridViewRow)Container).RowIndex + " :اندیس سطر در گرید" %>' CommandName="deleteCommand" CommandArgument="<%# ((GridViewRow)Container).RowIndex %>" />
<asp:Button ID="Button2" runat="server" Text='<%# Container.DataItemIndex + " :اندیس رکورد در دیتاسورس" %>' CommandName="deleteCommand" CommandArgument="<%# Container.DataItemIndex %>" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
دکمه ای که توسط asp:ButtonField تو گرید قرار میگیره، به صورت خودکار شماره سطر گرید رو تو e.CommandArgument قرار میده
دکمه اول تو ItemTemplate باز هم شماره سطر گرید رو تو e.CommandArgument قرار میده و فقط تو
دکمه دوم تو ItemTemplate هستش که مقدار e.CommandArgument میشه شماره رکورد تو دیتا سورس. این هم به خاطر این هستش که شما همه رکوردها رو دارید واکشی میکنید. اگه فقط رکوردهای
Page جاری رو از دیتابیس واکشی کنید، اونوقت Container.DataItemIndex هم تو همه صفحات از 0 شروع میشه (که معادل همون شماره سطر گرید خواهد بود)
موفق باشید