PDA

View Full Version : سوال: مشکل با trigger در َajax



mahdidabaghi
دوشنبه 22 آبان 1391, 20:14 عصر
سلام دوستان
من یک کنترل چک باکس در فرم دارم با این ویژگیها :

<asp:CheckBox ID="ch" runat="server" OnCheckedChanged="ch_CheckedChanged" />
و یک lable به این صورت :

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:Label ID="lblStatus" runat="server" Text="Hello"></asp:Label>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="ch" EventName="OnCheckedChanged" />
</Triggers>
</asp:UpdatePanel>

همونطور که میبینید lable در یک update panel قرارداره و با استفاده از trigger میخوام وقتی روی چک باکس
(که با توجه به کد بالا بیرون از update panel قرار داره) کلیک میشه بره و کد زیر رو به صورت ajax اجرا کنه

protected void ch_CheckedChanged(object sender, EventArgs e)
{
lblStatus.Text = "Okkkkkkkkkkk";
}

ولی نمیدونم چرا برنامه ارور میده و OnCheckedChanged رو نمیشناسه.
میشه راهنمایی بفرمایین کجای کارم ایراد داره که برنامه به درستی اجرانمیشه؟

fakhravari
دوشنبه 22 آبان 1391, 22:08 عصر
اگر در گرید نمیشه.
نیازی به <Triggers> نداره!

mahdidabaghi
دوشنبه 22 آبان 1391, 23:38 عصر
اگر در گرید نمیشه.
نیازی به <Triggers> نداره!
منظورتونو نفهمیدم.ولی من همین کار رو بجای چک باکس با باتن انجام دادم(و بجای OnCheckedChanged h تابع click رو گذاشتم و جواب گرفتم)
ولی متاسفانه واسه چک باکس جواب نمیده.اخه مشکلش چیه؟

saeed_sho
سه شنبه 23 آبان 1391, 09:24 صبح
اشتباه شما خیلی سادست دوست عزیز باید در eventName بنویسید CheckedChanged نه OnCheckedChanged
شما on رو بردار تا مشکلت حل بشه

mahdidabaghi
سه شنبه 23 آبان 1391, 19:00 عصر
اشتباه شما خیلی سادست دوست عزیز باید در eventName بنویسید CheckedChanged نه OnCheckedChanged
شما on رو بردار تا مشکلت حل بشه
دوست گرامی پیرو حرفهای شما من این تغییرات به صورت زیر اعمال کردم

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:Label ID="lblStatus" runat="server" Text="Hello"></asp:Label>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="ch" EventName="CheckedChanged" />
</Triggers>
</asp:UpdatePanel>



یعنی اومدم و onCheckedChanged رو به CheckedChanged تغییر دادم ولی متاسفانه بازهم جواب نداد.کجای کارم اساتید اشتباهه؟

saeed_sho
سه شنبه 23 آبان 1391, 19:23 عصر
نگاه کنید ببینید خاصیت autupostback رو برای چک باکس true کردید

<asp:CheckBox ID="CheckBox1" runat="server" AutoPostBack="true" />

saeed_sho
سه شنبه 23 آبان 1391, 19:26 عصر
در پست اول که پراپرتی autopostback کنترل چک باکس رو تعریف نکردید فکر کنم اشکال از اونه

mahdidabaghi
سه شنبه 23 آبان 1391, 20:05 عصر
در پست اول که پراپرتی autopostback کنترل چک باکس رو تعریف نکردید فکر کنم اشکال از اونه
از دوست گل خودم saeed_sho (http://barnamenevis.org/member.php?208173-saeed_sho) کمال تشکر رو دارم
با راهنمایی ایشون این مشکل حل شد .ولی باز یه مشکل عجیب دیگه پیش اومد
من همون چک باکس رو به صورت زیر در گرید قرار میدم:

<asp:GridView ID="GridView1" runat="server" Height="100px" Width="400px" ShowFooter="True"
HorizontalAlign="Center" OnSelectedIndexChanged="GridView1_SelectedIndexChanged">
<Columns>
<asp:TemplateField>
<FooterTemplate>
in the name of god
</FooterTemplate>
<ItemTemplate>
<asp:CheckBox ID="ch" runat="server" OnCheckedChanged="ch_CheckedChanged" AutoPostBack="true"/>
</ItemTemplate>
<HeaderStyle VerticalAlign="Middle" />
</asp:TemplateField>
</Columns>
<EditRowStyle Height="10px" HorizontalAlign="Center" VerticalAlign="Middle" Width="980px" />
<FooterStyle BackColor="#3399FF" />
<HeaderStyle Height="5px" BackColor="red" />
<RowStyle BackColor="Yellow" Height="10px" HorizontalAlign="Center" VerticalAlign="Middle"
Width="980px" Wrap="True" CssClass="colot" />
</asp:GridView>

ولی نمیدونم چرا این ارور رو در زمان اجرا میده :

A control with ID 'ch' could not be found for the trigger in UpdatePanel 'UpdatePanel1'.

fakhravari
چهارشنبه 24 آبان 1391, 00:38 صبح
کنترلی در داخل گرید ندارد.
نیاز به تریگر نداره
<Columns>

<asp:TemplateField>
<ItemTemplate>

<asp:CheckBox ID="ch" runat="server" AutoPostBack="true"
oncheckedchanged="ch_CheckedChanged1" />
</ItemTemplate>
</asp:TemplateField>
</Columns>

protected void ch_CheckedChanged1(object sender, EventArgs e)
{
CheckBox ch = (CheckBox)sender;
GridViewRow row = (GridViewRow)ch.NamingContainer;
string ID = GridView1.DataKeys[row.RowIndex].Value.ToString();
Fakhravary.MSG.Message.MessageBox_Script(ch.Checke d.ToString(), this);
}

mahdidabaghi
چهارشنبه 24 آبان 1391, 01:05 صبح
کنترلی در داخل گرید ندارد.
نیاز به تریگر نداره
<Columns>

<asp:TemplateField>
<ItemTemplate>

<asp:CheckBox ID="ch" runat="server" AutoPostBack="true"
oncheckedchanged="ch_CheckedChanged1" />
</ItemTemplate>
</asp:TemplateField>
</Columns>

protected void ch_CheckedChanged1(object sender, EventArgs e)
{
CheckBox ch = (CheckBox)sender;
GridViewRow row = (GridViewRow)ch.NamingContainer;
string ID = GridView1.DataKeys[row.RowIndex].Value.ToString();
Fakhravary.MSG.Message.MessageBox_Script(ch.Checke d.ToString(), this);
}
من که اون چک اکس رو در گرید گذاشتم.منظورتون چیه؟
و ایا این روش شما بدون رفرش شدن انجام پذیره؟

fakhravari
چهارشنبه 24 آبان 1391, 09:01 صبح
خب الان رفرش نمیشه که!!
فقط گرید بزار در یک ابدیت پنل

mahdidabaghi
چهارشنبه 24 آبان 1391, 10:13 صبح
خب الان رفرش نمیشه که!!
فقط گرید بزار در یک ابدیت پنل
ممنون از جوابتون
ولی نمیشه مثل پست 1 که چک باکس بیرون از آپدیت پنل و فقط لیبل درون آپدیت پنل قرار داره حالا هم گرید که توی اون چک باکس قرار داره بیرون از اپدیت پنل قرار داشته باشه و باز فقط لیبل درون اپدیت پنل قرار بگیره؟
شرمنده که اگه سوالاتم مبتدیانس!!!!!!!!
ممنون از شما

fakhravari
چهارشنبه 24 آبان 1391, 10:48 صبح
ابن کار شما باعث بست بک می شود.
چون CheckBox اصلا توی ابدیت پنل نیست.
<asp:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode="Conditional">
<ContentTemplate>

<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>

</ContentTemplate>
</asp:UpdatePanel>
<asp:CheckBox ID="CheckBox1" runat="server" AutoPostBack="True"
oncheckedchanged="CheckBox1_CheckedChanged" />
protected void CheckBox1_CheckedChanged(object sender, EventArgs e)
{
if (CheckBox1.Checked || !CheckBox1.Checked)
{
Label1.Text = CheckBox1.Checked.ToString();
UpdatePanel2.Update();

}
}

mahdidabaghi
چهارشنبه 24 آبان 1391, 13:54 عصر
ابن کار شما باعث بست بک می شود.
چون CheckBox اصلا توی ابدیت پنل نیست.
<asp:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode="Conditional">
<ContentTemplate>

<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>

</ContentTemplate>
</asp:UpdatePanel>
<asp:CheckBox ID="CheckBox1" runat="server" AutoPostBack="True"
oncheckedchanged="CheckBox1_CheckedChanged" />
protected void CheckBox1_CheckedChanged(object sender, EventArgs e)
{
if (CheckBox1.Checked || !CheckBox1.Checked)
{
Label1.Text = CheckBox1.Checked.ToString();
UpdatePanel2.Update();

}
}
ممنون
نمیدونم شاید واقعا این روشش باشه
ولی من همون چک باکس رو در پست یک در بیرون از اپدیت پنل گذاشتم و و وقتی روش کلیک میکنم(با توجه به این که در تریگر قرار داره) بدون رفرش شدن میره و خاصیت تکست لیبل رو عوض میکنه.بازم ممنون

mahdidabaghi
چهارشنبه 24 آبان 1391, 14:55 عصر
:لبخند: جالب بود.
اره مهندس جالبه... چک باکس تنهت تو اپدیت پنل جواب میده ولی وقتی این چک باکس رو در گرید میذاریم و گرید رو در اپدیت پنل میذارین جواب نمیده.
در ضمن من اگه به قول شما گرید رو هم در اپدیت پنل بذارم (با توجه به این که در برنامم گرید بالای صفحه و لیبل پایین صفحه سایتم قرار داره) باید اندازه اپدیت پنلمو خیلی بزرگ در نظر بگیرم که این اصلا جالب نیست و به عبارتی اصلا دیگه تریگر چیز بیخودی میشه.
ولی از این که منو راهنمایی کردین بسیار ممنونم جناب fakhravari (http://barnamenevis.org/member.php?128926-fakhravari)
دوستان دیگه نظری ندارن درباره این مطلب؟

mahdidabaghi
چهارشنبه 24 آبان 1391, 15:26 عصر
در ضمن برای دلیل حرفایی که در پست بالا زدم میتونید به این لینک سری بزنید
http://barnamenevis.org/showthread.php?342032-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A8%D9%87%DB%8C%D9%86%D9%87-GridView-%D8%AF%D8%B1-UpdatePanel&highlight=trigger+%D8%AF%D8%B1+ajax
امیدوارم این تایپیک با کمک شما به نتیجه برسه

fakhravari
چهارشنبه 24 آبان 1391, 22:10 عصر
من که نفهمیدم اخرش چی میخواهی؟

mahdidabaghi
پنج شنبه 25 آبان 1391, 09:53 صبح
من که نفهمیدم اخرش چی میخواهی؟
من یه روش بهینه تر میخوام مهندس.یکبار دیگه پست 15 و 16 رو نگاه بفرمایین تا متوجه عرایضم بشین

malloc
پنج شنبه 16 آذر 1391, 00:39 صبح
بنظر منم حرفهای آقای فخراوری درست بود و پست 11 جواب شما رو میده .