PDA

View Full Version : سوال: بدست آوردن سطر انتخاب شده در GridView



gilas1368
جمعه 03 خرداد 1392, 08:51 صبح
سلام به همگی
من ی GridView دارم داخل این Grid یه ستون برای حذف اطلاعات گذاشتم و داخل این ستون ی Button هم برای حذف گذاشتم
اما مشکلم اینجاست اگه که کاربر روی یه سطر کلیک کنه و هر دکمه حذفی رو بزنه عملیات حذف انجام میشه
مثلا فرض کنین کاربر سطر اول رو انتخاب کرده
حالا میره و دکمه حذف رو مثلا از سطر پنجم میزنه ( کاربر فقط روی دکمه کلیک میکنه ینی سطر پنجم انتخاب نمیشه. همون سطر اول در حالت انتخاب قرار داره)
و عملیات حذف همون سطر اول انجام میشه و سطر اول از گرید و دیتابیس حذف میشه

چطور میتونم جلوی این مشکل رو بگیرم که اگه کاربر روی دکمه حذف سایر سطرها غیر از سطر انتخاب شده کلیک کرد یه پیغام نمایش داده بشه و به کاربر بگه که فقط سطر انتخاب شده قابل حذف شدن هستش:متفکر:

ممنون میشم اگ راهنماییم کنین
من توی ASP تازه کارم

ashkufaraz
جمعه 03 خرداد 1392, 09:36 صبح
protected void gvDetails_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName.Equals("Delete"))
{
int index = Convert.ToInt32(e.CommandArgument);
GridViewRow row = gvDetails.Rows[index];
string productID = gvDetails.DataKeys[index].Value.ToString();
string productName = row.Cells[1].Text;
this.RemoveProduct(productID, productName);
}
}

اگر بازم مشکل داری این رو بخون نمونه کاملش است
http://www.codeproject.com/Articles/12666/GridView-Delete-with-Confirmation

ali9698
جمعه 03 خرداد 1392, 09:50 صبح
کلید اصلی هر سطر که در بانک اطلاعاتی داری رو بریز توی خصوصیت command name اون دکمه delete
و به جای استفاده از رویداد click مربوط به دکمه از رویداد command استفاده کن و کد زیر رو در اون بنویس
به جای X (خط ششم) ایندکس ستونی که دکمه حذف داخلش هست رو بنویس

protected void btn_submit_Command(object sender, CommandEventArgs e)
{
Button b1;
for (int i = 0; i < GridView1.Rows.Count; i++)
{
b1 = (Button)GridView1.Rows[i].Cells[X].Controls[0];
if (e.CommandName == b1.CommandName && GridView1.SelectedIndex == i)
{
//کدهای حذف سطر
}
else
{
Page.ClientScript.RegisterStartupScript(Page.GetTy pe(), "msg", "alert('دکمه حذف را اشتباه کلیک کردید')", true);
}
}
}

gilas1368
جمعه 03 خرداد 1392, 10:43 صبح
کلید اصلی هر سطر که در بانک اطلاعاتی داری رو بریز توی خصوصیت command name اون دکمه delete
و به جای استفاده از رویداد click مربوط به دکمه از رویداد command استفاده کن و کد زیر رو در اون بنویس
به جای X (خط ششم) ایندکس ستونی که دکمه حذف داخلش هست رو بنویس

protected void btn_submit_Command(object sender, CommandEventArgs e)
{
Button b1;
for (int i = 0; i < GridView1.Rows.Count; i++)
{
b1 = (Button)GridView1.Rows[i].Cells[X].Controls[0];
if (e.CommandName == b1.CommandName && GridView1.SelectedIndex == i)
{
//کدهای حذف سطر
}
else
{
Page.ClientScript.RegisterStartupScript(Page.GetTy pe(), "msg", "alert('دکمه حذف را اشتباه کلیک کردید')", true);
}
}
}


متشکرم

اما چطوری باید مقدار کلید اصلی رو بریزم توی Command Name?
و اگه میتونید خواستم خواهش کنم خط ششم رو توضیح بدید ک چه کاری انجام میده؟
بیشتر روی قسمت Controls[0] گیرم میخوام بدونم چکاری انجام میده
کد توی else رو هم اگه توضیح بدید ممنون میشم

ali9698
جمعه 03 خرداد 1392, 12:31 عصر
کد توی else برای اجرا کد های جاوااسکریپت داخل کدهای سی شارپ استفاده میشه که باعث میشه یک پیام به کاربر نشون داده بشه
خط ششم باعث میشه متغیر b1 که نوع button هست به اون دکمه ای که شما داخل سطر i اُم و ستون X اُم دارید اشاره بکنه. controls[0] هم به این خاطر هست که اولین شی موجود در سطر i و ستون X رو در نظر بگیره.
برای این که کلید اصلی رو توی command name بزارید از این کد استفاده کنید و به جای کلمه code نام فیلد کلید اصلی رو بزارید

<asp:Button ID="Button4" runat="server" CommandName='<%# Eval("code", "{0}") %>' onclick="Button4_Click" Text="Button" />

gilas1368
جمعه 03 خرداد 1392, 12:39 عصر
میشه توی CommandArgument هم نوشتش درسته؟
منظورم اینطوریه:

CommandArgument='<%# Eval("اسم فیلد کلید اصلی")

ali9698
جمعه 03 خرداد 1392, 14:17 عصر
آره فرقی نداره اما command argument خروجی object میده که نیاز به tostring() داره اما command name خروجی string میده. البته این کدی که نوشتی کامل نیست. باید به این صورت باشه

CommandArgument='<%# Eval("code", "{0}") %>'