PDA

View Full Version : checkbox در repeater



rahil_2008
چهارشنبه 22 اردیبهشت 1389, 23:15 عصر
سلام دوستان
من یه repeater دارم که در اون اطلاعاتی را با استفاده از یه pagedatasource ریختم. در repeater یه checkbox هم در نظر گرفتم که کاربر بتونه کتاب مورد نظرش را برای خرید انتخاب کنه. حالا مشکلم اینه که وقتی کاربر checkbox را تیک می زنه، برنامه اینو تشخیص نمی ده!
در حالت عادی با دستور:



foreach (Control c in x.Controls)
{


CheckBox mychk=(CheckBox)c.FindControl("chkbuy");
if (mychk.Checked)
{
Response.Write("yes");


}


می شه فهمید که کاربر checkbox را تیک زده یا نه
ولی حالا که checkbox را داخل repeater قرار دادم تشخیص نمی ده!
اگه لازمه که ببینید، اینم تگ های داخل repeater هست:


<asp:Repeater ID="Repeater1" runat="server" >
<ItemTemplate>
<table>
<tr>
<td>
<<asp:CheckBox ID="chkbuy" ToolTip ='<%#Eval("name")%>' runat="server" Text="select " />
</td>
</tr>
</table>
</div>
</ItemTemplate>

</asp:Repeater>

لطفا راهنمایی کنید

Vahid_moghaddam
پنج شنبه 23 اردیبهشت 1389, 08:45 صبح
به این شکل عمل کنید:



bool ch=((CheckBox)Repeater1.Items[1].FindControl("chkbuy")).Checked;

rahil_2008
جمعه 24 اردیبهشت 1389, 01:01 صبح
ببینید من یه همچین دستوری نوشتم:


foreach (RepeaterItem x in Repeater1.Items )
{
foreach (Control c in x.Controls)
{
foreach (Control f in c.Controls)
{
if (f.GetType().ToString().Equals("System.Web.UI.WebControls.CheckBox"))
{
Response.Write("ok<br>");
if (((CheckBox)f).Checked == true)
Response.Write("yes<br>");
}
}
}
}

هنگام اجرا ok را نمایش داد اما yes را نه.
یعنی در واقع وجود داشتن checkbox را تشخیص می ده اما تیک خوردن اونو تشخیص نمی ده و اینه که برای من عجیبه!:متعجب:
لطفا راهنماییم کنید و با عرض معذرت خیلی فوری

h.alizadeh
جمعه 24 اردیبهشت 1389, 19:12 عصر
کدمن اینطوریه:


Dim gvIDs AsString = ""
Dim chkBox AsBoolean = False
ForEach gv As RepeaterItem In Repeater1.Items
Dim deleteChkBxItem As CheckBox = CType(gv.FindControl("CheckBox1"), CheckBox)
If deleteChkBxItem.Checked Then
chkBox = True
gvIDs += deleteChkBxItem.Text.ToString + ","
EndIf
Next



ریپیترم هم اینطوریه:


<asp:Repeater ID="Repeater1" runat="server" DataSourceID="SqlDataSource1">
<ItemTemplate>
<asp:CheckBox ID="CheckBox1" Text='<%#Eval("NewsID")%>'
CssClass="HiddenText" runat="server" />
<%#Eval("title")%>
<br />
<br />
</ItemTemplate>
</asp:Repeater>

rahil_2008
یک شنبه 02 خرداد 1389, 13:05 عصر
سلام دوست عزیز
دستور ctype در vb هست من دستور معادلشو در c# می خوام

PhoenixNet
یک شنبه 02 خرداد 1389, 16:58 عصر
foreach (RepeaterItem item in Repeater1.Items)
{
CheckBox chk = (CheckBox)item.FindControl("checkbox");
if (chk.Checked)
{
//codes
}
else
{
//codes
}
}

rahil_2008
یک شنبه 02 خرداد 1389, 19:51 عصر
اگر به شروع تاپیک هم نگاه کنید منم این راهو امتحان کردم
در حالت عادی جواب می ده ولی الان چون تو repeater هست جواب نمی ده!

PhoenixNet
یک شنبه 02 خرداد 1389, 19:58 عصر
کد برنامت رو هم بزار تا ببینیم.

h.alizadeh
یک شنبه 02 خرداد 1389, 19:59 عصر
سایتی جهت تبدیل کد وی به سی شارپ و برعکس
http://www.developerfusion.com/tools/convert/vb-to-csharp/

rahil_2008
دوشنبه 03 خرداد 1389, 22:26 عصر
کد برنامت رو هم بزار تا ببینیم.

دوست عزیز کد را در همین تاپیک می تونید ملاحظه کنید

ببینید من یه همچین دستوری نوشتم:.........

mehdima
سه شنبه 04 خرداد 1389, 09:23 صبح
با سلام
جناب rahil_2008 اگر كدتون رو Trace كنيد مي بينيد كه كد حلقه foreach آخري اصلا اجرا نميشه چون در عبارت (Control f in c.Controls) متغير f برابر null است.طبيعيه چون هر كنترل موجود در RepeaterItem فقط در يك سطح داراي كنترل مي باشد.يعني شما در itemtemplate مربوط به Repeater1 كنترلي كه شامل كنترل فرزند باشد نداريد. بنابراين اگر كدي كه در حلقه foreach سومي هست رو يك سطح بياريد بالاتر جواب ميده.به اين صورت:


foreach (RepeaterItem x in Repeater1.Items)
{
foreach (Control c in x.Controls)
{
if (c.GetType().ToString().Equals("System.Web.UI.WebControls.CheckBox"))
{
Response.Write("ok<br>");
if (((CheckBox)c).Checked == true)
Response.Write("yes<br>");
}
}
}
ولي اگر از كد زير استفاده كنيد همانطور كه دوستمون PhoenixNet گفته بودن از نظر كارايي بهتره.در واقع با استفاده از تابع FindControl حلقه آخر رو ميتونيد حذف كنيد.(هر چند خود findcontrol هم با پيمايش كنترل مورد نظر رو سرچ ميكنه ولي به احتمال زياد بهينه تره.)



foreach (RepeaterItem items in Repeater1.Items)
{
CheckBox ch1 = (CheckBox)items.FindControl("chkbuy");
if (ch1.Checked)
Response.Write("yes<br>");
}

PhoenixNet
سه شنبه 04 خرداد 1389, 12:21 عصر
سلام اگه مشکلت حل نشده یه نمونه برت نوشتم که تو ضمیمه میتونی دانلود کنی.

rahil_2008
سه شنبه 04 خرداد 1389, 21:50 عصر
با سلام و تشکر از توجه دوستان
phoenixnet عزیز
اول اینکه من برنامه شما رو اجرا کردم و با این پیام خطا مواجه شدم:

Error 2 Could not load file or assembly 'CheckBox' or one of its dependencies. This assembly is built by a runtime newer than the currently loaded runtime and cannot be loaded.

بعد کدتون را بررسی کردم دیدم شما بصورت دستی به خصوصیت checked از checkbox، مقدار true/false دادین درحالیکه من می خوام کاربر حق انتخاب checkbox را داشته باشه و دقیقا مشکلم همینه. یعنی سیستم خود checkbox ها رو تشخیص می ده اما اینکه کدوم از اونا رو کاربر تیک زده را تشخیص نمی ده!

با سلام
جناب rahil_2008 اگر كدتون رو Trace كنيد مي بينيد كه كد حلقه foreach آخري اصلا اجرا نميشه چون در عبارت (Control f in c.Controls) متغير f برابر null است.طبيعيه چون هر كنترل موجود در RepeaterItem فقط در يك سطح داراي كنترل مي باشد.يعني شما در itemtemplate مربوط به Repeater1 كنترلي كه شامل كنترل فرزند باشد نداريد. بنابراين اگر كدي كه در حلقه foreach سومي هست رو يك سطح بياريد بالاتر جواب ميده.به اين صورت:

در حالت عادی حق با شماست اما چون من این کدها رو در usercontrol استفاده کردم باید سه سطحی بنویسم تا وجود checkbox را تشخیص بده و اصلا با این قضیه مشکلیم ندارم مشکل فقط اینه که checkbox های انتخاب شده را تشخیص نمی ده