经常上CSDN社区论坛的朋友应该知道在CSDN里面结贴的时候会让你给各个回帖的人一定的分值作为报酬。此时我们不能固定TextBox框的个数,因为回帖的人数是不固定的。而且如果将TextBox控件和单一的回帖人关联则会导致后台代码冗余,也不利于维护和扩展吗,显得不灵活不显示。

QQ空间的留言本里面也是类似的情况。当有人给我们留言的时候我们要回复这个留言就点击“回复”就会出现一个TextBox框出来,然后我们填好自己的留言点击“提交”系统就自动提交了我们的留言。一般对这种重复的数据读取我们经常是用Repeater控件来做,而且也能比较灵活得分页,更可贵的是它能够做到动态生成控件。

下面我们就来实现类似QQ留言和回复留言的效果。

<asp:Repeater ID="Rep" runat="server">

<ItemTemplate>

<table border="1" width="100%" cellpadding="0" cellspacing="0">

<tr>

<td id="Right_img" width="25%" align="center" valign="top" rowspan="3">

<br />

<%# "<img src=" + "../image/head/" + DataBinder.Eval(Container.DataItem,"HeadImage") + ".gif" + ">" %>

<br />

<br />

<br />

<%# DataBinder.Eval(Container.DataItem, "Name") %>

<br />

<%# DataBinder.Eval(Container.DataItem, "GuessDate") %>

</td>

<td id="Right_Top" height="22" align="center">

留言标题:<%# DataBinder.Eval(Container.DataItem, "Title") %>

</td>

</tr>

<tr>

<td valign="top" align="left" style="padding-top:15px;padding-bottom:25px;padding-left:2px;">

<br />

<%# DataBinder.Eval(Container.DataItem, "Content") %>

<br />

<br />

<%# DataBinder.Eval(Container.DataItem, "Reply") %>

<%# DataBinder.Eval(Container.DataItem, "RDate") %>

<br />

<div id='<%#"Reply" + DataBinder.Eval(Container.DataItem, "ID") %>' style="display:none;">

<p>----------------------------</p>

<asp:TextBox ID="RepInput" runat="server" TextMode="MultiLine" Width="300" Height="70"></asp:TextBox>

<br />

<asp:LinkButton ID="RepButton1" runat="server" CommandArgument= '<%# Eval("id")+","+(Container as RepeaterItem).ItemIndex%>'  OnCommand="RepButton_Click" CommandName="save">提交</asp:LinkButton>

<a href="javascript:;" οnclick='HideReply("<%#"Reply"+DataBinder.Eval(Container.DataItem,"ID") %>")' >取消</a>

</div>

</td>

</tr>

<tr id="Right_Bottom" valign="middle">

<td height="22" valign="middle">

<div id="UserInfo">

<img class="im" src="../image/email.gif" alt="Email" height="15" width="15" /><%#"<a href=mailto:"+ DataBinder.Eval(Container.DataItem, "Email") +">电子邮箱</a> "%>

<img class="im" src="../image/home.gif" alt="Email" height="15" width="15" /><%#"<a href=http://"+ DataBinder.Eval(Container.DataItem, "HomePage")+" >个人主页</a>"%>

<img class="im" src="../image/oicq.gif" alt="Email" height="15" width="15" /><%#"<a href= "+ DataBinder.Eval(Container.DataItem, "QQ")+" >QQ</a> "%>

<span id="Master">

<a href="javascript:;" οnclick='ShowReply("<%#"Reply"+DataBinder.Eval(Container.DataItem,"ID") %>")'>回复留言</a>

<asp:LinkButton ID="LinkButton2" runat="server" OnClientClick="return confirm('确定要删除这条留言么?');" OnCommand="Del_Click" CommandArgument= '<%# DataBinder.Eval(Container.DataItem,"ID") %>'>删除留言</asp:LinkButton>

</span>

</div>

</td>

</tr>

</table>

</ItemTemplate>

</asp:Repeater>

我们姑且不去深究这段代码,只需要去注意一下红色部分就好。

红色部分是一个隐藏的Div层,里面是一个TextBox控件和一个用于提交回复留言的LinkButton控件。

本来这个层是隐藏的,正常情况下是看不到的。当我们点击下面的超链接“回复留言”的时候这个层就显示出来(相关的js代码忽略)。然后我们在这个层里的TextBox框输入我们的留言,随即点击“提交”控件提交内容。这个时候就有一个问题了:我们是怎么获得Repeater控件里面的控件值的(注意:这个控件是“活的”,是在运行的时候根据客户来输入的,而不是我们定死的内容,如Label控件!)并将这个值写进数据库中相关的表中并且用于区分是对这个留言者的回复?

要解决以上问题就必须了解Repeater控件的运行机制原理。既然是重复得读取记录,那么肯定有用于区分记录的“项值”,因此(Container as RepeaterItem).ItemIndex这个就是因此诞生。对于第一条记录它的只为0,第二条它的值为1,以此类推…因此我们就可以用它和我们数据库表中的主键一起传递到后台代码中。

CommandArgument= '<%# Eval("id")+","+(Container as RepeaterItem).ItemIndex%>'的意思很明显,id 就是后台数据库中留言记录唯一的主键值,中间隔一个逗号之后再连接一个项值。这样在后台我们就能够轻松得到这两个主要的值了。

后代相关事件代码如下:

public void RepButton_Click(object sender, CommandEventArgs e)

{

RepText = this.Rep.Items[Convert.ToInt32(e.CommandArgument.ToString().Split(',')[1])].FindControl("RepInput") as TextBox;

System.Data.OleDb.OleDbConnection con = MengXin.MyCode.DB.CreateConnect();

System.Data.OleDb.OleDbDataAdapter Ada = new System.Data.OleDb.OleDbDataAdapter("Select * from GuestBook where state = yes and ID = " + e.CommandArgument.ToString().Split(',')[0], con);

System.Data.OleDb.OleDbCommandBuilder Bui = new System.Data.OleDb.OleDbCommandBuilder(Ada);

DataSet ds = new DataSet();

Ada.Fill(ds, "RepGuestBook");

if (ds.Tables["RepGuestBook"].Rows.Count > 0)

{

ds.Tables["RepGuestBook"].Rows[0]["Reply"] = "----------------------<br />管理员回复:<br /><br /><p style='color:#fcb202'>" + RepText.Text + "</p><br />于";

ds.Tables["RepGuestBook"].Rows[0]["RDate"] = System.DateTime.Now.ToString();

Ada.Update(ds, "RepGuestBook");

}

else

{

Response.Write("<script language=javascript>alert('无记录!');window.location='Default.aspx';</script>");

}

con.Close();

Response.Write("<script language=javascript>window.location='Default.aspx';</script>");

}

注意事件中红色的部分,RepText是一个TextBox控件,主要是接收客户点击的项中的回复留言的内容。

具体的还需要多多练习实践。如果结合Ajax,实现一下局部刷新就完美实现了QQ留言板的功能了…

PS:以上代码在XP+IIS5.1+VS2008+IE8+ACCESS测试通过…

转载于:https://www.cnblogs.com/saper/archive/2009/06/03/1495056.html

获取Repeater控件里动态声称的控件的值相关推荐

  1. CreateChildControls 里动态生成的控件 PostBack 之后不能保持状态

    CreateChildControls 要先把控件的层次创建好在给控件值. 就是给值语句一定要在controls.add之后,不是所有的都这样,反正这样准没错!

  2. android日历价格控件,Android 自定义价格日历控件

    介绍 上个星期项目有一个日历价格的需求,类似一个商品在不同的日期价格可能会不同,由于时间给得特别紧所以打算找个合适的开源项目进行修改.参考了网上大多数是通过继承view直接draw一个monthVie ...

  3. 项目杂记——在后台获取Repeater控件里面的控件

    如果是Repeater控件里面的html控件,在后台就不是简单的一句this.控件ID就可以获取到的,因此,在菜鸟做项目的过程中就遇到了这样的问题,一下代码是解决问题的关键: 比如说获取id为rptP ...

  4. android获取控件的id(标识符)-根据控件id获取对应的值或控件名字-动态获取R.string的值

    更多其他页面-自定义View-实用功能合集:点击查看 项目中需要动态获取资源R.string的值,记录一下解决方案. demo链接: link. 直接先上个示例,下面再有详细解说: @Override ...

  5. 【ASP.NET】js动态生成的控件,在后台获取不到怎么办?

    JS代码如下: oNewNode.innerHTML = "  <input type=file id=file"+filecount+" οnchange=per ...

  6. 使用GridView做出列选择效果(获取动态生成的控件.鼠标点选GridView.Ajax控件)

    先看效果图: 其实就是个一览定制的效果,只不过由于项目的需要,需要使用GridView进行设计,至于为什么不直接使用Html+JQuery,还是因为项目需要,不然维护起来会很麻烦,在制作的过程中会遇到 ...

  7. 关于怎么获取Repeater控件复选框选中的那一行的数据

    关于怎么获取Repeater控件复选框选中的那一行的数据 1.首先你要有一个repeater控件,并且里面有复选框控件 2.废话不多话,直接上代码 Dim i As Integer'Car是repea ...

  8. FindChildControl与FindComponent(动态创建的控件要通过Owner.FindComponent去找该控件)

    前两天编码遇到了要使用FindChildControl方法获取指定名称的TSpeedButton按钮,结果折腾了半天就是没得结果(基础不扎实,呵呵),于是赶紧搜索了下,补习关于这两个方法的用法. TW ...

  9. 【Silverlight】Bing Maps开发应用与技巧二:自定义图钉标注控件和动态ToolPanel

    在Bing Maps Silverlight Control中以及为我们提供了地图图钉控件Pushpin,我曾经在< 使用图钉层(Pushpin layer)及地图图层(MapLayer)> ...

  10. 用户控件中动态加入脚本引用

    用户控件中动态加入脚本引用,添加前先判断是否已经有引用,没有才添加. //××××.ascx protected void Page_Load(object sender, EventArgs e){ ...

最新文章

  1. 用最少的时间学最多的数据挖掘知识(附教程数据源)| CSDN博文精选
  2. 项目管理——WBS工作分解法
  3. 大神对飞控精准高度估计算法解读
  4. qt-信号和槽的连接写法
  5. Python多线程--互斥锁、死锁
  6. hdu 3746 kmp求循环节 下标从1开始
  7. 小熊派IoT开发板系列教程正式发布——免费学习
  8. 红米Note 8 Pro新配色公布:轻盈一握宛若浮华在手
  9. 项目管理经验的获取 .
  10. 《可信计算的研究与发展》;C-Rank:一种Deep Web数据记录可信度评估方法
  11. 考勤系统 服务器管理,考勤管理系统ZKNet Web Server管理
  12. ToDesk 远程软件推荐测评
  13. ipc$与默认共享及ipc$连接失败的原因
  14. Python分析《武林外传》 -----转载
  15. 怎么提取视频中的音频?教你快速学会这三个方法
  16. winxp右键进入dos
  17. 「云」上风景虽好,但不要盲目跟风
  18. MOS逻辑门(反相器/与门/或门/或非门/与非门)
  19. 使用 Unity 和 C 开发您的首个游戏
  20. C-------------使用scanf输入字符串的故事;

热门文章

  1. react 使用rewired_使用react-app-rewired和customize-cra对默认webpack自定义配置
  2. java nio 追加写文件_java.nio.file读写文件
  3. java comparable排序_java_Java使用Comparable解决排序问题,本文实例讲述了Java使用Comparabl - phpStudy...
  4. win7网络里计算机登录失败,Win7系统访问网络时提示“登陆失败”的解决方法
  5. php获取cookie值的方法,怎么获取cookie的值
  6. 自动驾驶 9-4: 改进的 EKF - 错误状态扩展卡尔曼滤波器 An Improved EKF - The Error State Extended Kalman Filter
  7. 翻译: 自动驾驶汽车技术:自动驾驶汽车如何工作?
  8. 独立样本t检验、方差齐性检验
  9. MVC案例之DAO层实现
  10. python的字典合并有相同的_将列表中的重复项合并到python字典中