PDA

View Full Version : تفاوت Render - RenderContents - CreateChildControls چیست؟



habedijoo
جمعه 06 بهمن 1385, 11:55 صبح
با سلام به همگی دوستان .
من در حال ساختن Custom Control هستم . و نه User Control . متدهای Render منو گیج کردند . هرچند که چندین مقاله و فصل مربوط به ساخت کنترلهای سروری رو خوندم .
چند تا سوال دارم :
اینکه تفاوت متدهای Render در چیه ؟
چه موقع از Render و چه موقع از RenderCotents استفاده میکنیم . ؟
هر کدام از این متدهای Render در کدام دوره از LifeCycle کنترل انجام میشوند ؟
متدهای Renderی که با هم ترکیبی استفاده میشوند کدامند ؟
بوسیله کدام متدها هست که میتوان در Design Time هم ظاهر کنترل ها را دید . ؟

با تشکر .

titbasoft
جمعه 06 بهمن 1385, 18:07 عصر
از rendercontent زمانی استفاده می شود که می خواهید یک کنترل فرزند رو رندر کنیدمثلا زمانی که با begintag کنترلتون رو شروع کردید می تونید با صدا زدن متد rendercontent از کنترل child اون رو توی کنترل parent رندر کنید

titbasoft
جمعه 06 بهمن 1385, 18:09 عصر
با این توضیح به این نتیجه می رسید که هر دو رو در design time میشه دید

habedijoo
شنبه 07 بهمن 1385, 08:41 صبح
جناب titabsoft متوجه منظورتون دقیقا نشدم .

titbasoft
شنبه 07 بهمن 1385, 11:23 صبح
Protected Overrides Sub Render(ByVal w As System.Web.UI.HtmlTextWriter)

w.AddAttribute("style", "border:2px solid green;")
w.RenderBeginTag("DIV")

w.AddAttribute("style", "background-color:red;")
Dim b As New Button
b.Text = "button inside DIV"
Me.Controls.Add(b)
MyBase.RenderContents(w)
' MyBase.Render(w) '=> see the difference

w.RenderEndTag()

End Sub

habedijoo
شنبه 07 بهمن 1385, 13:51 عصر
جناب titabsoft بسیار ممنونم .
ابتدا عرض کنم که بوسیله متد RenderControl که هر کنترلی دارد نیز میتوان یک کنترgل را به فرم اضافه کرد . (مثلا Button.RenderControl(Ouput))
sسوال اصلی من اینه :
چند تا متد با نام Render شروع می شوند ارتباط این متدها و زمان استفاده از هر کدام منو کاملا گیج کرده است . ؟ (Render - RenderChildren - RenderContents - RenderControl)

باز هم ممنونم .

titbasoft
شنبه 07 بهمن 1385, 16:18 عصر
امیدوارم این یکی بیشتر مطلب رو برسونه

Public Class MyWebControl
Inherits WebControl


Public Sub New()
MyBase.New("DIV")
End Sub

Protected Overrides Sub AddAttributesToRender(ByVal w As HtmlTextWriter)
w.AddStyleAttribute("background-color", "Red")
MyBase.AddAttributesToRender(w)
End Sub

Protected Overrides Sub RenderContents(ByVal w As HtmlTextWriter)
w.Write("What I want to be inside of my control's tag")
MyBase.RenderContents(w)
End Sub


Protected Overrides Sub RenderChildren(ByVal w As System.Web.UI.HtmlTextWriter)
Dim b As New Button
b.Text = "Control in control collection"
MyBase.Controls.Add(b)
MyBase.RenderChildren(w)
End Sub

Protected Overrides Sub Render(ByVal w As System.Web.UI.HtmlTextWriter)
w.Write("Render Method")

'I want to see the HTML output result of another control after it's rendered, on my HtmlTextWriter
Dim c As New ImageButton
c.RenderControl(w)

MyBase.Render(w)
End Sub
End Class

habedijoo
یک شنبه 08 بهمن 1385, 11:36 صبح
جناب titbasoft خیلی ممنون . عالی بود .
توی این مثال یه چیزی برام جالب بود . وقتی که در حالت Design طول و عرض کنترل و اضافه میکنیم کنترلهایی که در متد RenderChildren اضافه کرده بودیم تکرار میشوند. ولی وقتی برنامه اجرا میشود تنها همان کنترلهای ابتدایی نمایش داده میشوند .
و یک چیز جالبتر اینکه اگر Style کنترل را در حالت Design تغییر دهیم محوطه ای که مربوط به کنترلهای Content می شود شامل تغییر می شود .

titbasoft
یک شنبه 08 بهمن 1385, 12:18 عصر
و یک چیز جالبتر اینکه اگر Style کنترل را در حالت Design تغییر دهیم محوطه ای که مربوط به کنترلهای Content می شود شامل تغییر می شود .به همین دلیله که اگر content رو تگ نزده باشید به طور پیش فرض خودش یک Span میزنه.

فکر کنم اگر این تست رو انجام بدید یه کم تفاوت ها روشن تر بشه، توی Render کنترل بیس رو (MyBase) رندر نکنید. می بینید که هیچکدوم از تغیراتی رو که توی متدهای دیگه روی MyBase دادید دیده نخواهند شد و مستقیم کنترل شما رندر میشه