What's the best way to show multiple checkboxes for multiple records in ASP.NET
情况如下:
我有一个包含许多RSS类别的数据库,而这个数据库又包含许多RSS提要。我想用以下方式显示它们:
1 2 3 4 5 6 7 8 9 | RSS Category 1 [ ] Rss Feed 1 [ ] Rss Feed 2 [ ] Rss Feed 3 RSS Category 2 [ ] Rss Feed 1 [ ] Rss Feed 2 [ ] Rss Feed 3 |
其中[]表示复选框。
因此,每个RSS提要都会根据父RSS类别的ID从数据库中拉出。我不能使用复选框列表,因为每个复选框必须包含在无序列表项中。我需要标记在语义上是正确的,并且不能使用控制适配器。
我最初设想了两个嵌套的中继器,外部的一个数据绑定到数据库中的RSS类别列表,该列表显示类别标题并包含一个具有类别ID的隐藏控件,然后是一个具有该类别的RSS源的内部中继器。
如何从父转发器中的隐藏字段控件访问类别ID,以便查找正确的RSS源?
我想你可能在找这样的东西:
ASPX:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | <HeaderTemplate> <ul style="list-style-type: none"> </HeaderTemplate> <ItemTemplate> <li id='<%# Eval("Id") %>'> <%# Eval("Category") %> <HeaderTemplate> <ul style="list-style-type: none"> </HeaderTemplate> <ItemTemplate> <li> ' /> </li> </ItemTemplate> <FooterTemplate> </ul> </FooterTemplate> </asp:Repeater> </li> </ItemTemplate> <FooterTemplate> </ul> </FooterTemplate> </asp:Repeater> |
代码落后:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | protected void Page_Load(object sender, EventArgs e) { using (SqlConnection conn = new SqlConnection(connString)) { conn.Open(); SqlCommand cmd = new SqlCommand("SELECT id, category FROM rsscategory_tbl", conn); SqlDataReader rdr = cmd.ExecuteReader(); this.rptOuter.DataSource = rdr; this.rptOuter.DataBind(); rdr.Close(); } } protected void rptOuter_ItemDataBound(object sender, RepeaterItemEventArgs e) { if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { using (SqlConnection conn = new SqlConnection(connString)) { conn.Open(); System.Data.Common.DbDataRecord rd = (System.Data.Common.DbDataRecord)e.Item.DataItem; SqlCommand cmd = new SqlCommand("SELECT feed FROM rssfeed_tbl WHERE categoryid =" + rd.GetInt32(rd.GetOrdinal("id")), conn); Repeater rptInner = (Repeater)e.Item.FindControl("rptInner"); SqlDataReader rdr = cmd.ExecuteReader(); rptInner.DataSource = rdr; rptInner.DataBind(); rdr.Close(); } } } |
I need the markup to be semantically correct and cant use the Control Adapters.
您指的是这些适配器吗?如果没有,你应该看看。您不必使用整个集合;编辑.browser文件只指定
我有一个应用程序需要动态地创建各种不同的控件。它对于多个复选框(或其他任何相关内容)都可以正常工作。
首先,在ASPX页面上,放置"placeholder"控件:
1 |
现在,在代码隐藏中,动态创建控件:
1 2 | Label aLbl = new Label {Text ="Prompt:", ID = ("WSLabel" + counter++)}; CtrlCanvas.Controls.Add(aLbl); |
这是一个标签,这里是一个文本框:
1 2 3 | TextBox aBox = new TextBox {ID ="XTest1", Columns = 5, Text ="", Width = 50}; CtrlCanvas.Controls.Add(aBox); aBox.Focus(); |
这是一个收音盒列表:
1 2 3 4 5 6 | RadioButtonList WRRadio = new RadioButtonList { ID ="XTestRadioList1" }; WRRadio.Items.Add("Walking "); WRRadio.Items.Add("Running"); WRRadio.SelectedIndex = WalkRun; WRRadio.RepeatColumns = 2; CtrlCanvas.Controls.Add(WRRadio); |
这就是创建控件的全部功能。要获取这些值,需要有一个命名约定,该约定允许您标识ASP.NET在控件上放置的前缀。我用"xtest"。下面是一个例子:
1 2 3 4 5 6 7 8 9 10 | foreach (string aStr in Form.AllKeys) { int position = aStr.IndexOf("XTest"); // XTest is used in my controls if (position > 0) { // Get the *prefix* added by ASP.NET CtlPrefix = aStr.Substring(0, position); break; } } |
现在,要获得存储在特定控件中的值,很容易:
1 | string result = Form.Get(CtlPrefix +"XTest1") |
对于单选框,get至少返回所选索引。我想您将分别为每个复选框命名,这样您就可以选中0或1。
希望这有帮助!
如果不能使用复选框列表,则必须手动处理这些值。
您可以手动.controls.add(new literalcontrol("
你可以使用一个带有模板列的数据报来侵入它,但这并不优雅。
为什么这需要在列表中?复选框列表是否提供了您需要的功能?
另外,尝试mycheckbox.parent.controls.findcontrol("myHiddenField").value。
如何从父转发器中的隐藏字段控件访问类别ID,以便查找正确的RSS源?