PDA

View Full Version : اضافه کردن کارایی به کنترل های دینامیک



twelve
پنج شنبه 15 آذر 1386, 17:26 عصر
سلام به همه بزرگواران

اولا بگم که در مورد سوالم سرچ کردم اما جوابش رو پیدا نکردم ممنون میشم راهنمایی کنید

من توی صفحه یک کنترل table دارم که مطالب به صورت پویا به سطر هاش اضافه میشه و یک کنترل Button هم بعد از اضافه شدن هر مطلب به سطر بعد اضافه میشه که قراره با کلیک شدنش ، اون مطلب رو حذف و دیتابیس رو به روز کنه!
من 2 تا مشکل دارم
1- نحوه دسترسی به هر کدوم از این button ها
2- نحوه اضافه کردن دستورات حذف به زیر برنامه هر کدوم از button ها ، به طور کلی من نمیدونم کارایی این باتن ها رو کجا بنویسم که با کلیک شدن هر کدوم از اونها مطلب متناظر حذف بشه !!

سیستم تقریبا چیزی شبیه به صفحات انجمن است!

abolfazl585
پنج شنبه 15 آذر 1386, 18:39 عصر
من اینکار رو کردم و جواب گرفتم.
اول یک جدول خالی بدون tr و td بنداز تو design ، مثل این:

<table id="mytbl" runat="server">
</table>
حالا برو توی کدهات و در رویداد OnInit هرچی لازم داری بنویس
یعنی اینکه اون جدول بطور مستقیم از داخل کد قابل دسترسی هست و می تونی به اون سطر و ستون اضافه کنی.
هر وقت که button رو ساختی ، قبل از اینکه اون رو به یکی از سلول های جدول add کنی ، رویداد OnClick اون button رو تعریف کن.
همین
حالشو ببر

twelve
شنبه 17 آذر 1386, 20:02 عصر
نه! این روش واسه وقتی هست که بخواهیم با کنترلهای HTML کار کنیم و اون رویداد OnClick رو با جاوا بنویسیم ، من که گفتم یک کنترل table دارم ( asp:table ) که ....

تا اونجا که می دونم باید اینکار از طریق ViewState یا Session صورت بگیره اما دقیقا نمیدونم چه جوری!! نمیدونم AddHandler واسه هر کدوم از این باتن ها رو چطوری به صورت پویا و جداگانه ایجاد کنم بدون اینکه محدودیتی در تعداد باتن ها داشته باشم!!
به هر حال نحوه دسترسی به هر کنترل باید از طریق ID اون باشه و این یعنی ID هر باتن باید به صورت پویا با یک تابع ساخته بشه. برای مثال فرض میکنیم که باتن های زیر رو ایجاد میکنیم:



public sub BtCreate(byval ID as string)
Dim bt as button
For i as integer = 1 to 4
i+=1
ID="button" & i
bt=new button
bt.id=id
next
end sub

به این ترتیب مثلا 4 تا دکمه با ID های اختصاصی ساخته میشن !! حالا چطور تعیین کنیم که با کلیک شدن این دکمه ها یک مطلب حذف بشه و اون مطلب متناظر با همون دکمه باشه؟؟!
(در واقع رویداد Click هر دکمه رو چطور و کجا تعیین کنیم??)
( امیدوارم تونسته باشم مفهوم رو برسونم ، هر کی حلش کنه جایزه داره:لبخند: )

abolfazl585
شنبه 17 آذر 1386, 21:02 عصر
عزیزم منظور من هم دقیقا همین کاری بود که شما گفتین.
اون OnClick رو هم که گفته بودم منظورم ServerSide بود.
اگه تا حالا تونستی که Button ها رو رو صفحه Add کنی و همه کار کردی، به جز تعریف کدهای مربوط به Button ها پس:
قاعده کلی کار اینه:
نیازی نیست که برای همه Buttonها یک Event بسازی.
خاصیت OnClick همه Button ها رو فقط به یک Event میتونی Handle کنی.
چجوری؟:

btn.OnClick = new
حالا بعد از کلمه New اگه دو بار کلید Tab رو بزنی، یه Event برات ساخته میشه که می تونی همه Button ها تون رو به اون Event ارجاع بدین.
حالا داخل همون Event که دات نت برات ساخته میتونی از کد زیر استفاده کنی:

Button btn = (Button)sender;
حالا، این btn همون Buttonی هست که کلیک کرده بودی و هر استفاده ای می تونی ازش بکنی.

anahita_s
شنبه 17 آذر 1386, 21:06 عصر
با سلام
یه سر به این لینک ها بزنید شاید مفید باشه:

http://barnamenevis.org/forum/showthread.php?t=34654
http://forums.nsd.ir/nsd/archive/index.php/thread-847.html
http://forums.nsd.ir/nsd/archive/index.php/thread-652.html

موفق باشید.

abolfazl585
شنبه 17 آذر 1386, 21:37 عصر
حیف که VisualStudio رو سیستمم نصب نیست تا یه Method برات بنویسم که مشکلت حل شه.
و در مورد مقالاتی که توصیه کردین:
من خیلی از آقا احسان متشکرم که تجربیات خودشون رو بیان میکنن و خیلی هم به روش های ایشون احترام میگذارم ولی:


Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If IsPostBack Then
addall()
Else
add("ehsan")
End If
End Sub

PageLoad در هر PostBack، یک بار اجرا میشود و نوشتن کدی که همیشه اجرا شود typeSafe نیست.


If id = "ali" Then Session("ali") = True
استفاده از Session برای این کار هم سرعت اجرای پردازش را کند میکند و هم وجود TimeOut برای Sessionها درصد وجود خطا را بسیار بالا می برد.

ضمنا این روش انعطاف پذیر نیست و نمیشه زیاد روش مانور داد.

scorpion_man
دوشنبه 19 آذر 1386, 13:58 عصر
سلام به همه بزرگواران

اولا بگم که در مورد سوالم سرچ کردم اما جوابش رو پیدا نکردم ممنون میشم راهنمایی کنید

من توی صفحه یک کنترل table دارم که مطالب به صورت پویا به سطر هاش اضافه میشه و یک کنترل Button هم بعد از اضافه شدن هر مطلب به سطر بعد اضافه میشه که قراره با کلیک شدنش ، اون مطلب رو حذف و دیتابیس رو به روز کنه!
من 2 تا مشکل دارم
1- نحوه دسترسی به هر کدوم از این button ها
2- نحوه اضافه کردن دستورات حذف به زیر برنامه هر کدوم از button ها ، به طور کلی من نمیدونم کارایی این باتن ها رو کجا بنویسم که با کلیک شدن هر کدوم از اونها مطلب متناظر حذف بشه !!

سیستم تقریبا چیزی شبیه به صفحات انجمن است!
با سلام به دوستان عزیز
کار خیلی راحتتر از این حرفاس
اگه داری این کارو انجام میدی بهتره از کنترل datalist استفاده کنی البته اگه میخوای این کارو تو وب انجام بدی و باید یک template به اون صورتی که گفتی رو تعریف کرده و برای هر button یک آرگومان که میتونه همون id سطرت رو database باشه پاس کنی و تو event دیتا لیست on command از پارامتر e.command_argument همون آرگومان رو گرفته و باهاش database رو به روز بکنی که خیلی ساده هست
اما اگه نخواستی این کارو بکنی باید از متد addhandler object,sub برای همه button هایی که به صورت dynamic داری ایجاد میکنی یک sub رو به عنوان handler برای همه button ها به صورت مشترک تعریف بکنی حالا هر وقت button ی کلیک بشه همون یک sub فراخوانی میشه و میتونی با یه ctype(sender,system.button یک نمونه از همون button رو با مشخصاتی که قبلا تعریف کردی داشته باشی و باهاش کار بکنی بازم اگه مشکلی داشتی من خدمتت هستم
موفق باشی

twelve
دوشنبه 19 آذر 1386, 20:43 عصر
با سلام به دوستان عزیز
کار خیلی راحتتر از این حرفاس
اگه داری این کارو انجام میدی بهتره از کنترل datalist استفاده کنی البته اگه میخوای این کارو تو وب انجام بدی و باید یک template به اون صورتی که گفتی رو تعریف کرده و برای هر button یک آرگومان که میتونه همون id سطرت رو database باشه پاس کنی و تو event دیتا لیست on command از پارامتر e.command_argument همون آرگومان رو گرفته و باهاش database رو به روز بکنی که خیلی ساده هست
اما اگه نخواستی این کارو بکنی باید از متد addhandler object,sub برای همه button هایی که به صورت dynamic داری ایجاد میکنی یک sub رو به عنوان handler برای همه button ها به صورت مشترک تعریف بکنی حالا هر وقت button ی کلیک بشه همون یک sub فراخوانی میشه و میتونی با یه ctype(sender,system.button یک نمونه از همون button رو با مشخصاتی که قبلا تعریف کردی داشته باشی و باهاش کار بکنی بازم اگه مشکلی داشتی من خدمتت هستم
موفق باشی






میشه لطفا یک کد سمپل بذارین اینجا ؟؟ من که درست متوجه نمیشم!

scorpion_man
سه شنبه 20 آذر 1386, 00:24 صبح
سلام دوستان کدوم راهو میخوای همون راهو برات کد سمپل بزارم
اولی استفاده از datalist هست دومی کنترل دینامیکی
اولی که خیلی ساده هست کل وب پر از سمپلاش
حالا شما هر کدومو خواستی بگو برات سمپل بنویسم
موفق باشید

twelve
چهارشنبه 21 آذر 1386, 20:02 عصر
لطفا اگر میشه هر 2 رو بذار ( مخصوصا دومی ) دمت گررررررم

scorpion_man
پنج شنبه 22 آذر 1386, 00:34 صبح
لطفا اگر میشه هر 2 رو بذار ( مخصوصا دومی ) دمت گررررررم
با سلام به دوست عزیز
گفتم اولی یه کنترل ساده datalist هست که اگه به کنترل باکس ویژال استودیو نگاه بندازید می بینیدش
اما دومی چشم حتما پایین کد برات میزارم
موفق باشید

scorpion_man
پنج شنبه 22 آذر 1386, 00:56 صبح
اولین کار ایجاد داینامیک کنترل هست که من اینجا یه button رو توضیح میدم بقیه کنترلها هم به این صورت هستند


Dim BtnSample as New Button
BtnSample.ID="Anyname"
BtnSample.Text="ViewName"
BtnSample.CommandName="CommandName"

خوب اینجا اول من یه کنترل رو تعریف کردم یه id بهش دادم که اگه اینو ندید سیستم خودش یه id یکتا ایجاد میکنه
بعدش یه commandname براش تعریف کردم البته با این command name کاری نخواهیم داشت
ولی من از این استفاده میکنم تا ببینم این button که زده شده قرار بوده چیکار برای من انجام بده

scorpion_man
پنج شنبه 22 آذر 1386, 01:13 صبح
خوب الان کنترل ما ایجاد شده
حالا باید برای این کنترل یه event ی رو نسبت بدیم تا به رویداد هاش رسیدگی بکنه


AddHandler BtnSample.Click, New System.EventArgs(AddressOf Sub_Name)

خوب اینجا با کلمه کلیدی AddHandler اومدیم Event کلیک کنترل تعریف شده رو با یه نمایندگی نسبت دادیم به روتین یا همون sub تعریف شده
البته باید یدونه EventArgs رو نمونه سازی کرده و ارسال بکنیم به اون Sub که میخواهیم درستش بکنیم البته اینو باید متذکر بشم که این EventArgs ها برای کنترلهای مختلف با هم فرق می کنن

scorpion_man
پنج شنبه 22 آذر 1386, 01:24 صبح
خوب الان ما همه چی رو تعریف کردیم فقط مونده ایجاد Sub ی که Event های ما رو Handle بکنه برای این کار


ProtectedSub BtnSample_Click(ByVal sender AsObject, ByVal e As System.Web.UI.WebControls.EventArgs)
Dim MyButton as Button=Ctype(sender,Button)
Dim CommandName as String=MyButton.CommandName
Select Case CommandName
Case "any_Command_Name"
..
..
..
Case "anyOther_CommandName
..
..
..
End Select
End Sub

البته من اینجا اومدم همه Click ها رو تو یه روتین handle کردم شما می تونید زمان نسبت handle ها با addhandler ارجاع بدید به sub های مختلف
من اومدم اینجا از commandname که اونجا تعریفش کردم اومدم به نحوی استفاده کردم و کاری که button کلیک شده باید انجام بده رو در آوردم که کار اصلی این هم با کاری که من انجام دادم تفاوت چندانی نداره
امیدوارم مفید واقع شده باشه
موفق باشید

amir.net
شنبه 15 دی 1386, 10:29 صبح
با تشکر از اسکرپیون
من توی پست شماره 13 گرفتار نحسی سیزده شدم
AddHandler BtnSample.Click, New System.EventArgs(AddressOf Sub_Name)

به نظر شما علت پیام خطای زیر چیست(این خطا مربوط به دستور بالامیباشد)
Too many arguments to 'Public Sub New

scorpion_man
شنبه 15 دی 1386, 12:06 عصر
با تشکر از اسکرپیون
من توی پست شماره 13 گرفتار نحسی سیزده شدم
AddHandler BtnSample.Click, New System.EventArgs(AddressOf Sub_Name)

به نظر شما علت پیام خطای زیر چیست(این خطا مربوط به دستور بالامیباشد)
Too many arguments to 'Public Sub New

با سلام به دوست عزیز
شما اون sub ی که نوشتین برای handle کردن رویدادها رو بزارید مشکل از اون باید باشه یعنی آرگومانهایی که شما به sub پاس میکنید مطابقت نداره
من قبلا هم عرض کردم بستگی به کنترلی داره که میخواهید handle بکنیدش eventargs ها باید تطابق داشته باشند بازم اگه sub رو بزارید بیشتر میتونم کمک بکنم
موفق باشید

scorpion_man
شنبه 15 دی 1386, 12:27 عصر
چون کنترلها با هم فرق دارند من بالا کلی نوشتم من پایین یه مثال برای فرضا کنترل image button میزارم شاید مشکلات حل بشه
اولین کار ساخت یک sub برای handle کردنه


Protected Sub SampleEvent_Click(ByVal sender As Object, ByVal e As System.Web.UI.ImageClickEventArgs)
روالها و کدهای مورد نظر
End Sub

بعد از تعریف یک روال حالا وقت ساخت یک کنترل و تعریف یک handler برای اونه


Dim SampleImageButton As New ImageButton
AddHandler SampleImageButton.Click, New System.Web.UI.ImageClickEventHandler(AddressOf Me.SampleEvent_Click)
Me.Controls.Add(SampleImageButton)

موفق باشید

amir.net
شنبه 15 دی 1386, 13:53 عصر
با تشکر از راهنمائی شما
من از link button استفاده میکردم همانطور که نوشتید و پس از مقایسه با کدی که فرستادید مشکلم حل شد