PDA

View Full Version : Attatch کردن رویداد Click به یک کنترل در زمان اجرا



amin joon
جمعه 18 دی 1383, 12:55 عصر
من یک بانک اطلاعاتی دارم که یکی از فیلد های آن حاوی ادرس یک عکس است .
حالا میخوام این عکس ها را در یک صفحه نمایش بدم بطوری که کاربر با کلیک کردن بر روی هر یک از عکسها بتونه بقیه فیلد های مربوط به اون رکورد رو ببینه .
مشکل من این هست که نمیدونم چطوری میشه یک کنترل ImageBotton در زمان اجرا ایجاد کرد به طوری که با اتفاق افتادن رویداد Click آن, یک زیرروال اجرا شود.
:گیج:

Behrouz_Rad
جمعه 18 دی 1383, 15:45 عصر
سلام.
بهتر اینه که از تگ img به جای کنترل ImageButton استفاده کنید.
این عمل موجب صرفه جویی در منابع سرور و به طبع افزایش راندمان کار شما خواهد شد.
یک Repeater ایجاد کنید و آن را با Bind، DataReader کنید.


<asp:Repeater
ID="rptImages"
Runat="Server">
<ItemTemplate>
<br>
<a href='<%# Container.DataItem( "image_url" ) %>'>
<img src='<%# Container.DataItem( "image_url" ) %>'></img></a>
</ItemTemplate>

</asp:Repeater>

و اما برای نمایش محتویات رکوردهای مربوط به عکس انتخاب شده به طریق زیر عمل کنید:
یک فیلد از نوع identity که به صورت AutoNumber باشد در جدول خود ایجاد کنید.
حال همراه با لینک عکس کلیک شده و در آخر آن، محتوای مشخه ی مربوط به عکس را قرار دهید.
پس خط شش فوق، به شکل زیر اصلاح می شود:


<a href='<%# Container.DataItem( "image_url" ) %>?id=<%# Container.DataItem( "image_ID" ) %>'>

در صفحه ای که مقادیر به آن ارسال می شوند نیز مقدار id را توسط QueryString بگیرید و محتویات رکورد مورد نظر را به راحتی نمایش دهید.

در صورتی که مایل به استفاده از ImageButton نیز هستید می توانید از خاصیت ItemCommand مربوط به Repeater استفاده کرده و از آرگومان e که در روال ImageButton قرار دارد به عنوان تشخیص Image انتخاب شده استفاده کنید.
موفق باشید.
:wink:

kochol
جمعه 18 دی 1383, 18:34 عصر
سلام

من این کار را قبلا انجام دادم

تو باید این کارها را انجام بدی

1. تعریف عکس


dim imgb(100) as imagebutton

2. در روال page_load آنها را تعریف کن و نمایش بده و هرگز از if ispodtback=false then استفاده نکن چون دیگه روال های کلیکت کار نمی کند



dim c as integer=0
con.open()
dim re as sqldata.sqldatareader =cmd.excutereader
while re.read
c += 1
imgb(c)=new imagebutton
with imgb(c)
.id = "img(" & c & ")"
.commandname=re(0)
.....
end with

addhandler imgb(c).command,addressof imgb_command
panel1.controls.add(img(c))
end while
re.close
con.close
end sub


3. نوشتن روال

اینجا برای اینکه ما از چندتا شی با یک روال مشترک استفاده می کنیم بهتر است از روال command استفاده کنی که می توانی به هر عکس دو تا مقدار بدهی که برات نگه دارند یکی هم که در بالا دیدی coommandname هست که اون یکی هم اولش command داره بعد تو روال مربوط می توانی با e.commandname بفهمی کدام کلیک شده است

این هم کد روال


Private Sub ImageButton1_Command(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.CommandEventArgs)

End Sub

البته ممکنه من بعضی جاها اشتباه تایپی داشته باشم

Behrouz_Rad
جمعه 18 دی 1383, 18:40 عصر
آرایه؟؟؟؟؟؟؟؟؟!!!!!!!!!!!!!
این کد شما که سرور رو .............. بیچاره سرور.
اصلا بهینه نیست.
راهی که بنده گفتم استانداردترین راهه.
Sure
:wise1:

amin joon
جمعه 18 دی 1383, 19:47 عصر
آقا بهروز من کد زیر رو در وبفرمم وارد کردم

<asp:Repeater id="Repeater1" runat="server">
<ItemTemplate>
<br>
<img src='<%#Container.DataItem("img_url")%>'>
</ItemTemplate>
</asp:Repeater>

و کد زیر رو هم در رویداد Load صفحه :


SqlConnection cnnplot=new SqlConnection("server=(local);uid=asp;pwd=;database=bongah");
SqlDataAdapter adpplot=new SqlDataAdapter("select code,name,model,payment,color,img_url from tblplot where type='s'",cnnplot);
DataSet dsplot=new DataSet();

adpplot.Fill(dsplot,"tblplot");
Repeater1.DataSource=dsplot.Tables["tblplot"].DefaultView;
Repeater1.DataBind();

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


CS0118: 'System.Web.UI.WebControls.RepeaterItem.DataItem' denotes a 'property' where a 'method' was expected

احتمالا درست متوجه راهنماییت نشدم
لطفا بگید ایراد از چیه :confy2:

kochol
جمعه 18 دی 1383, 21:22 عصر
آرایه؟؟؟؟؟؟؟؟؟!!!!!!!!!!!!!
این کد شما که سرور رو .............. بیچاره سرور.
اصلا بهینه نیست.
راهی که بنده گفتم استانداردترین راهه.

ببخشید قسمت کلیک ها سرور را بیجاره می کنه یا ایجاد کردن اشیا از این طریق

amin joon
جمعه 18 دی 1383, 22:44 عصر
اگه میشه بگید مترادف این کد که kochol نوشته در c چیه:

addhandler imgb(c).command,addressof imgb_command
من این رو هر جوری مینویسم ایراد میگیره
مر30 :wink:

Behrouz_Rad
شنبه 19 دی 1383, 10:47 صبح
DataReader شما کو؟

Repeater1.DataSource=dsplot.Tables["tblplot"].DefaultView;
من خیلی واضح توضیح دادم.
نیازی به DataSet ندارید
یک DataReader ایجاد کنید و آن را به Bind، Repeater کنید.


Dim Cnn As SqlConnection
Dim cmdSelect As SqlCommand
Dim Mydtr As SqlDataReader

' Retrieve records from database
Cnn = New SqlConnection( "Server=localhost;UID=sa;PWD=;Database=Pubs" )
cmdSelect = New SqlCommand( "Select * From MyTable", Cnn )
Cnn.Open()
Mydtr = cmdSelect.ExecuteReader()

' Bind to Repeater
Repeater.DataSource =Mydtr
Repeater.DataBind()

Mydtr.Close()
Cnn.Close()


یه فیلد AutoNumber هم ایجاد کنید و به عنوان پارامتر به صفحه ای که قصد نمایش رکوردهای اون عکس رو دارید بفرستید.

در ضمن آقای kochol شما درست سوال دوستمون رو متوجه نشدید.
آقای amin joon نوشتند:

میخوام این عکس ها را در یک صفحه نمایش بدم بطوری که کاربر با کلیک کردن بر روی هر یک از عکسها بتونه بقیه فیلد های مربوط به اون رکورد رو ببینه .
کد شما برای هر ImageButton به طور جداگانه روال ایجاد می کنه.

kochol نوشته:

ببخشید قسمت کلیک ها سرور را بیجاره می کنه یا ایجاد کردن اشیا از این طریق
این جمله معنا نداره.
موضوع به این واضحی نیاز به بحث و توضیح بیشتر نداره.
موفق باشید.
:wise1:

amin joon
شنبه 19 دی 1383, 16:25 عصر
من کدم رو بصورت بالا تغییر دادم ولی باز مشکل حل نشد.
اقای راد این خطایی که صادر میشه از کد موجود در تگ repeater است.


Compiler Error Message: CS0118: 'System.Web.UI.WebControls.RepeaterItem.DataItem' denotes a 'property' where a 'method' was expected

Source Error:



Line 15: <ItemTemplate>
Line 16: <br>
Line 17: <img src='<%#Container.DataItem("img_url")%>'>
Line 18: </ItemTemplate>
Line 19: </asp:Repeater>

Source File: d:\inetpub\wwwroot\WebApplication3\WebForm2.aspx Line: 17
شاید این سوال ها برای شما پیش پا افتاده باشه ولی برای ما مبتدی ها کمی مشکل است.
باز هم از شما متشکرم :wink: :)

Behrouz_Rad
شنبه 19 دی 1383, 16:54 عصر
amin jooooooooooon قربونت بشم.
فیلد img_url که من نوشتم اینجا یک مثاله عزیزم شما اسم فیلد خودتو بجاش بذار.
این Error میگه که فیلد img_url وجود نداره.
این دیگه پرسیدن داره.
مطمئنم اگه آقای نصیری این موضوع رو بفهمه خیلی عصبانی میشه. :mrgreen: :wink:

amin joon
شنبه 19 دی 1383, 18:43 عصر
عزیز جان برلدر ما گفتیم مبتدی هستیم اما نه این قدر که !!!!!!!! :strange: :kaf: :kaf:
من این کد رو موقعی که داشتم ارسال میکردم تغییر دادم که شما متوجه بشی.
شما اگر ممکنه یک بار خودت تست کن شاید چیزی رو جا انداختی :) :sunglass:

amin joon
شنبه 19 دی 1383, 22:39 عصر
آقا فهمیدم اشکال از چیه :flower: :mrgreen:

اگر کد Repeater رو به صورت زیر بنویسیم درست میشه:

<asp:Repeater id="Repeater1" runat="server">
<ItemTemplate>
<br>
<a href='WebForm1.aspx?id=<%#DataBinder.Eval(Containe r.DataItem,"code")%>'>
<img src='<%#DataBinder.Eval(Container.DataItem,"img_url")%>'></a>
</ItemTemplate>
</asp:Repeater>

بعد هم همونطور که گفتیددر صفحهی مقصد به وصیله ی Request.QueryString["code"] میشه چک کرد که کدوم عکس کلیک شده.

خیلی راه جالبی هست.
نگفتم یه چیزی رو جا انداختی :oops:

باز هم از شما بخاطر راهنماییهات تشکر میکنم ... :flower: هم بعنوان تشکر تقدیم به شما :thnx:

Behrouz_Rad
یک شنبه 20 دی 1383, 07:39 صبح
سلام.
مطمئن باش که کدی که نوشتم درست بود.
نیازی به Eval نیست.
مقادیر به صورت Object هستند نیازی به تغییر نوع ندارند.
:wise1: