PDA

View Full Version : استفاده از Repeater و جایگزینی کلمه ای با <%#container.dataitem('Body')%>



mojtaba-saleh
سه شنبه 06 فروردین 1387, 19:23 عصر
سلام
من میخوام در سایتی که درست می کنم امکان تعویض قالب رو توسط خود کاربر قرار بدم
در قسمت اخبار سایت برای مثال برای قاب اطراف خبر من از کد html زیر استفاده میکنم



[StartNewsBody]
<table border="1" width="391" height="202">
<tr>
<td height="26" width="391">&nbsp;</td>
</tr>
<tr>
<td height="166" width="391"> [NewsBody] </td>
</tr>
</table>
[FinishNewsBody]

کد بالا رو به صورت یک string به نام body تبدیل می کنم.
بعدش مقادیری که درون کروشه هست رو به صورت زیر جایگزین میکنم.


body = Replace(body, "[StartNewsBody]", "<asp:Repeater ID='Repeater1' runat='server' DataSourceID='SqlDataSource1'><ItemTemplate>")
body = Replace(body, "[FinishNewsBody]", "<SeparatorTemplate></SeparatorTemplate></ItemTemplate> </asp:Repeater>")
body = Replace(body, "[NewsBody]", "<%#container.dataitem('Body')%>")


و در آخر استرینگ Body رو به صورت <%=Body%> در قسمت کد های source خود vs قرار میدم.
همه چیز خوب عمل می کنه به جز <%#container.dataitem('Body')%> یعنی وقتی که خودم به صورت دستی کد هارو در قسمت source قرار میدم کار میکنه ولی وقتی اینجوری انجام میدم کار نمیکنه.
آیا این کار عملیه؟ اگر نه راه دیگه ای سراغ ندارید؟

mojtaba-saleh
سه شنبه 06 فروردین 1387, 19:26 عصر
در ضمن تست کردم که ببینم آیا Repeater در این حالت کار میکنه یا نه در بعد از template مثل کد زیر یک کقداری رو قرار دادم نشون داد. یعنی فقط اون کد مشکل داره باهاش.




body = Replace(body, "[StartNewsBody]", "<asp:Repeater ID='Repeater1' runat='server' DataSourceID='SqlDataSource1'><ItemTemplate>Matn Matn")
body = Replace(body, "[FinishNewsBody]", "<SeparatorTemplate></SeparatorTemplate></ItemTemplate> </asp:Repeater>")

adonis
سه شنبه 06 فروردین 1387, 21:01 عصر
من قبلا این کارو کردم. شدنیه
توی ItemTemplate خود ریپیتر یه literal بنداز
بعد توی itemdatabound اون ریپیتر متن اون literal رو مساوی body قرار بده
دیگه احتیاجی به [StartNewsBody]و[FinishNewsBody]هم نیست
به جای [NewsBody] هم مقدارشو بذار


((DataRowView)e.Item.DataItem)["column name"]

mojtaba-saleh
سه شنبه 06 فروردین 1387, 22:00 عصر
سلام
میشه یک نمونه برام بذارید.
نتونستم خودم انجامش بدم

adonis
سه شنبه 06 فروردین 1387, 22:09 عصر
اینو ببین فکر کنم کارت راه بیفته


<asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound">
<ItemTemplate>
<asp:Literal ID="ltr" runat="server"></asp:Literal>
</ItemTemplate>
</asp:Repeater>




protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
string body;
if(e.Item.ItemType== ListItemType.Item||e.Item.ItemType== ListItemType.AlternatingItem)
{
Literal ltr=e.Item.FindControl("ltr") as Literal;
ltr.Text =body.Replace("[NewsBody]", ((DataRowView)e.Item.DataItem)["newsbody"].ToString());
}
}

mojtaba-saleh
سه شنبه 06 فروردین 1387, 23:27 عصر
دیگه احتیاجی به [StartNewsBody]و[FinishNewsBody]هم نیست

سلام
مثل اینکه منظور منو متوجه نشدید.
من نیازم همینه.
من میخوام به جای اون کد ها از StartNewsBody و FinishNewsBody و NewsBody استفاده کنم
نمیخوام کاربرم درگیر این کد های ریپیتر بشه.
این کد شما در صورتی جواب داد که ریپیتر رو خودم اضافه کنم ولی من نیاز دارم به صورت یک رشته از دیتابیس ریپیترم فراخوانی بشه و در سایت قرار بگیره.
بگزارید یکم واضح تر بگم.
من کدهای قالب سایت رو در دیتابیس ذخیره میکنم. و بعد از فراخوانی اون تغییرات رو در اون انجام میدم (پست اول توضیح دادم)
در ریپیتر مثلا من میخوام فیلد Title رو از دیتابیسم فراخوانی کنم که برای اون از <%#container.dataitem('Title')%> استفاده میکنم. درحالت معمولی هیچ مشکلی نیست ولی در حالی که اون رشته های Newstart و ... با کدهای مربوط به ریپیتر جایگزین بشن و همه به عنوان یک رشته عمومی در قسمت source سایت با استفاده از <%=body%> قرار بگیرند.
اطلاعات دیتابیس نمایش داده نمی شن

mojtaba-saleh
سه شنبه 06 فروردین 1387, 23:33 عصر
اینو ببین فکر کنم کارت راه بیفته


<asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound">
<ItemTemplate>
<asp:Literal ID="ltr" runat="server"></asp:Literal>
</ItemTemplate>
</asp:Repeater>




protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
string body;
if(e.Item.ItemType== ListItemType.Item||e.Item.ItemType== ListItemType.AlternatingItem)
{
Literal ltr=e.Item.FindControl("ltr") as Literal;
ltr.Text =body.Replace("[NewsBody]", ((DataRowView)e.Item.DataItem)["newsbody"].ToString());
}
}


این هم با شرایط من کار نکرد

adonis
چهارشنبه 07 فروردین 1387, 17:50 عصر
شما ریپیتر رو توی صفحه بذارین کدهای قالب سایت رو توی اون literal به صورت dynamic تعریف میکنین.یعنی هر جا اون [newsbody] رو بندازه متن خبر بیاد و هر کد html ای باشه هونطوری نشون بده
این همونه که میخواستین دیگه، نه؟