کنترل مقدار CheckBox در یک Gridview در Asp.net WebForm
ستونی دارم در gridview از نوع چک باکس که تعدادی از آنها را تیک میزنم وقتی دکمه پایین صفحه را می زنم تا وضعیت تیک آنها رانشان دهد خود به خود همه آنها به مقدار پیش فرض اولشان (false) ریست میشوند هیچ روتینی برای ریست شدنشان ننوشته ام ایا حین کلیک روی دکمه اتفاق خاصی می افتد مثلا صفحه رفرش میشود؟ تمام راه حلهای پیشنهادی سایتها رو هم انجام دادم اما مقادیر چک باکسها ریست میشود و ثابت نمی ماند این هم خلاصه کدهای سمت کلاینت
<asp:GridView ID="Gv1" runat="server" AutoGenerateColumns="False" DataKeyNames="CustCode">
<Columns>
<asp:TemplateField HeaderText="نام و نام خانوادگی">
<EditItemTemplate>
<asp:CheckBox ID="ChkSel" runat="server" Text='<%# Bind("CustName") %>'
Width="150px" TextAlign="Right" />
</EditItemTemplate>
<ItemTemplate>
<asp:CheckBox ID="ChkSel" runat="server" Text='<%# Bind("CustName") %>'
Width="150px" TextAlign="Right" />
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="CustSelectCode" HeaderText="کد ملک" ItemStyle-Width="50px"
ItemStyle-HorizontalAlign="Left" />
</asp:GridView>
اینم سورس کد دکمه نمایش وضعیت در سمت سرور
Protected Sub btnShow_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnDel.Click
For Each Rg As GridViewRow In Gv1.Rows
Dim Ck As CheckBox = Rg.FindControl("ChkSel")
Rg.Cells(1).Text = IIf(Ck.Checked, "T", "F")
Next
End Sub
در روتین فوق اگر محتویات ستون اول true بود ستون دوم میشود t و در غیر اینصورت میشود F اینکار فقط جنب تست ستون اول را دارد
پاسخ هوش مصنوعی
مشکل اصلی این است که زمانی که دکمه را فشار می دهید، GridView مجدداً بارگذاری می شود و وضعیت CheckBox ها به حالت پیش فرض خود یعنی false
برمی گردد. برای حفظ وضعیت CheckBox ها، ابتدا باید اطمینان حاصل کنید که مقادیر را قبل از بارگذاری مجدد GridView ذخیره کنید. شما می توانید این کار را با استفاده از ViewState یا Session انجام دهید.
در اینجا یک روش ساده با استفاده از List برای پیگیری وضعیت CheckBox ها و سپس بروز رسانی GridView در هنگام بارگذاری انجام می شود:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
BindGridView()
End If
End Sub
Private Sub BindGridView()
' فرض کنید داده های شما به صورت DataTable هستند
Dim dt As New DataTable()
dt.Columns.Add("CustName")
dt.Columns.Add("CustCode")
' داده های تستی
dt.Rows.Add("Ali", "001")
dt.Rows.Add("Sara", "002")
dt.Rows.Add("Reza", "003")
Gv1.DataSource = dt
Gv1.DataBind()
End Sub
Protected Sub btnShow_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnShow.Click
Dim checkedItems As New List(Of String)()
For Each Rg As GridViewRow In Gv1.Rows
Dim Ck As CheckBox = Rg.FindControl("ChkSel")
If Ck.Checked Then
checkedItems.Add(Rg.Cells(1).Text) ' استفاده از CustCode به عنوان شناسه
End If
Next
' اکنون می توانید گنید CheckBox ها را دوباره بارگذاری کنید
RestoreCheckBoxes(checkedItems)
End Sub
Private Sub RestoreCheckBoxes(checkedItems As List(Of String))
For Each Rg As GridViewRow In Gv1.Rows
Dim Ck As CheckBox = Rg.FindControl("ChkSel")
Ck.Checked = checkedItems.Contains(Rg.Cells(1).Text) ' دوباره وضعیت تیک را تنظیم کنید
Next
End Sub
با استفاده از روش بالا، وضعیت CheckBox ها در هنگام فشار دادن دکمه حفظ شده و مجدداً بارگذاری می شود. همچنین توجه داشته باشید که در قسمت BindGridView
شما باید داده هایی که می خواهید در GridView نمایش دهید را بارگذاری کنید.
وقتی شما روی دکمه کلیک می کنید متد btnshow_Click در سمت سرور اجرا می شود. در واقع یک درخواست به سمت سرور ارسال شده و پاسخ درخواست شما از سمت سرور برگشت داده می شود. این ارسال درخواست به سمت سرور و دریافت پاسخ از سمت سرور به معنی یک Refresh می باشد و باعث میشه که CheckBox های شما مجدد رفرش بشه.
کلا سعی کنید برای کار چک باکس در وب از جی کوئری استفاده کنید چون مطمئن باشید در غیر این صورت با مشکلات عدیده ای روبرو میشید.
سپاس از راهنماییتان آیا راهی غیر از کد نویسی مثل تنظیمات یک خاصیت در صفحه ،برای عدم رفرش صفحه وجود دارد اگر نه ایا شما نمونه سورسی برای کنترل چک باکسها و نگهداری وضعیت آنها دارید؟
در کل آیتم هایی که خاصیت runat="server" دارند(مثل button ها)، عمل postback رو انجام میدن که این عمل باعث رفرش صفحه میشه.
شما باید از جاواسکریپت، جی کوئری و امثال اون استفاده کنید که عملیات رو سمت کلاینت انجام میدن.
روش دوم هم اینه که وضعیت چک باکس ها رو در کنار بقیه فیلدهای گریدویو، توی دیتابیس ذخیره کنید و با هر بار رفرش صفحه وضعیت فراخوانی بشه .
ممنون البته امکان ذخیره وضعیت چک باکس نیست چون جزوی از بانک اطلاعاتی نیست فیلد موقتی است جهت انتخابهای چند گانه در گراید ویوو اما اگر راه حلی از طریق اسکریپ نویسی دارید ممنون میشوم بدانم
از روش زیر میتونید استفاده کنید(اگر هدف شما فقط نمایش چک باکس های تیک خورده شده است):
1- ابتدا jquery رو به پروژه اضافه کنید :
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
2- یه html button اضافه کنید:
<input type="button" id="btn" value="test" />
3- کد های jquery رو اضافه کنید:
<script>
$("#btn").click(function () {
var list = [];
$('#<%= Gv1.ClientID %> input[type="checkbox"]').each(function () {
if($(this).is(":checked")){
list.push($(this).attr("id"));
}
});
alert(list)
});
</script>
توضیحات:
-این کد ابتدا آیدی GV1 که گریدویو هست رو میگیره و تمام چک باکس هاش رو پیدا میکنه. بعد میگه به ازای هر چک باکس بررسی کن اگه تیک خورده بود، اون رو توی لیست قرار بده. و در آخر لیست رو نمایش میده
- من در اینجا گفتم آیدی چک باکس رو نمایش بده. ولی شما میتونید بگید text چک باکش رو نمایش بده.
سپاسگذارم حتما تست می کنم نتیجه رو اعلان می کنم
- آموزش استفاده از پلاگین گردونه شانس در Asp.net core به همراه سورس
- نمایش متن به صورت فرمت شده در CkEditor
- آموزش استفاده از SignalR در Asp.net Core با مثال عملی
- ادغام چند گزارش استیمول سافت بصورت پی دی اف در یک فایل
- نحوه تغییر استایل کامپوننت select2 چگونه است ؟
- چگونه امنیت پروژه را در Asp.net Core افزایش دهیم ؟
- ارسال پارامتر در دستور window.open جی کویری
- ارسال پارامتر از طریق جاوااسکریپت با کلیک روی تگ a
- خطای 500 زمان اجرا شدن پروژه روی هاست
- کویری نویسی در استیمول سافت جهت فیلتر اطلاعات
- احراز هویت از طریق اکتیو دایرکتوری
- معنی و مفهوم و کاربرد Thread pool در وب
- نحوه حذف پس زمینه سیاه صفحه مدال در بوت استرپ
- منظور از فرانت اند و بک اند چیست ؟
- نمایش منو با راست کلیک کردن روی Ckeditor
- علت کند شدن سایت در Asp.net core
- انتقال کاربر به مسیر خاص بعد از لاگین در Asp.net core
- کار با رویداد SelectedDateChanged در کامپوننت تاریخ شمسی در سی شارپ
- نمایش گزارش StimulSoft در Asp.net Web form
- انتخاب MVC یا Core برای طراحی سایتی که با Asp.net پیاده سازی شده است