PDA

View Full Version : سوال: عمل نکردن دکمه در gridview



morika
یک شنبه 27 اسفند 1391, 13:01 عصر
سلام
من چندتا دکمه تو girview دارم که command name اونهارو خودم تعریف کردم و براشون کد نوشتم. یعنی از دکمه های آماده خود grid نیست. ولی مشکل الان اینه که این دکمه ها تو صفحه اول گرید خوب کار می کنن ولی وقتی گرید میره تو صفحه دوم دیگه دکمه ها کار نمی کنن. مشکل کجاست؟
ممنون

aliblue
یک شنبه 27 اسفند 1391, 13:11 عصر
مشکل توی کدهای شماست.

Mohammadvb6
یک شنبه 27 اسفند 1391, 14:21 عصر
لطفا کدهاتون بگذارید تا باهم بررسی کنیم .

morika
یک شنبه 27 اسفند 1391, 17:46 عصر
بفرمایین اینم کد
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();
}
}

saeed31641
یک شنبه 27 اسفند 1391, 22:21 عصر
ببین وقتی میگی میره صفح دوم دکمه ها کار نمیکنه یعنی اون کویری گرید یه بار بیشتر اجرا نمیشه تعداد اطلاعات بیار.اگه بتونی یه تریس کونی مشکلت می تونی حل کنی فقط تریس کن ببین کجا مشکل داری در غیر اینصورت یه پروژه کوچیک درست کن بزار تو سایت

morika
دوشنبه 28 اسفند 1391, 11:00 صبح
من قبلا همه این کارارو کردم که حالا اومدم اینجا سوال کردم دیگه. فکرم نکنم دیگه لازم باشه که یه پروژه کوچیک درست کنم بزارم اینجا چون فقط تو این تیکه کد مشکل دارم که اونم کامل گذاشتم. من فقط می خوام ببینم این یه مشکل معمول تو گرید هست و راه حل داره یا نه فقط واسه من پیش اومده.

Mohammadvb6
دوشنبه 28 اسفند 1391, 12:18 عصر
break point بذارید ببینیم کد تا چه مرحله ای اجرل میشه.

saeed31641
دوشنبه 28 اسفند 1391, 13:14 عصر
من قبلا همه این کارارو کردم که حالا اومدم اینجا سوال کردم دیگه. فکرم نکنم دیگه لازم باشه که یه پروژه کوچیک درست کنم بزارم اینجا چون فقط تو این تیکه کد مشکل دارم که اونم کامل گذاشتم. من فقط می خوام ببینم این یه مشکل معمول تو گرید هست و راه حل داره یا نه فقط واسه من پیش اومده.

دقیقا این مشکل که شما میگی برای منم اتفاق افتاده شما یه تیککه کد گذاشتی میگی مشکل اینه . من قول بهتون میدم مشکل تنها این نیست چون کد شما کاری نمیکنه-
شما دگمه آپدیت گذاشتی صفحاه دوم که میره کار نمیکنه مشکل شما همن دیگه.شما میتونی همون صفحه فقط این بزاری

morika
دوشنبه 28 اسفند 1391, 13:37 عصر
من مشکلم رو حل کردم. اتفاقا مشکل دقیقا مربوط به همین قسمت هست و هیچ ربطی به جاهای دیگه ندارم. حالا اینجا کاملا توضیح می دم که دوستان استفاده کنن
قضیه اینه که وقتی ما 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 کن.
اینجوری این مشکل حل میشه

saeed31641
دوشنبه 28 اسفند 1391, 15:07 عصر
خوب خدا رو شکر مشکلتون حل شد.
تمامی دوستان که پست گذاشتن قصد کمک به شما داشتن .ولی شما هم توقع نداشته باشه با یه تیکه کد براتون معجزه کنند اگه شما هم مشکلتون فهمیدی حتما با تریس کردن بود . حالا دوستان به یه تیکه .کد .........
اگه گفتم برنامه کوچیک درست کن بزار میخاستم تو سیستم خود براتون مشکل حل کنم که خودتون استاد بنده هستین مشکلتون حل کردین...

Himalaya
سه شنبه 29 اسفند 1391, 12:06 عصر
سلام

اتفاقا مشکل دقیقا مربوط به همین قسمت هست و هیچ ربطی به جاهای دیگه ندارم
اتفاقا مشکل اصلا به این قسمت ارتباطی نداره. (اصلا مشکلی نیست. بیشتر برداشت اشتباه شماس)

قضیه اینه که وقتی ما 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 کم کنه تا ایندکس صفحه جدید بدست بیاد.
نکنی این کارو یه وقت. چه کاریه آخه. کد پایین رو ببین

<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 شروع میشه (که معادل همون شماره سطر گرید خواهد بود)

موفق باشید