情况如下:
我有一个包含许多RSS类别的数据库,而这些数据库又有许多RSS源。我想以下列方式显示它们:
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 Feed都会从数据库中提取出来,具体取决于父RSS类别的ID。我不能使用CheckBoxList,因为每个复选框必须包含在无序列表列表项中。我需要标记在语义上正确,并且无法使用控制适配器。
我最初设想了两个嵌套的转发器,外部的一个数据绑定到数据库中的RSS类别列表,它显示了类别标题并包含一个带有类别ID的隐藏控件,然后是一个带有该类别的RSS源的内部转发器。
如何从父转发器中的隐藏字段控件访问类别ID,以便查找正确的RSS源?
答案 0 :(得分:2)
我想你可能正在寻找这样的东西:
ASPX:
<asp:Repeater ID="rptOuter" runat="server" OnItemDataBound="rptOuter_ItemDataBound">
<HeaderTemplate>
<ul style="list-style-type: none">
</HeaderTemplate>
<ItemTemplate>
<li id='<%# Eval("Id") %>'>
<%# Eval("Category") %>
<asp:Repeater ID="rptInner" runat="server">
<HeaderTemplate>
<ul style="list-style-type: none">
</HeaderTemplate>
<ItemTemplate>
<li>
<asp:CheckBox ID="chkFeed" runat="server" Text='<%# Eval("Feed") %>' />
</li>
</ItemTemplate>
<FooterTemplate>
</ul>
</FooterTemplate>
</asp:Repeater>
</li>
</ItemTemplate>
<FooterTemplate>
</ul>
</FooterTemplate>
</asp:Repeater>
代码背后:
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();
}
}
}
答案 1 :(得分:0)
如果您不能使用CheckBoxList,则必须手动处理这些值。
你可以在他们之间手动.Controls.Add(新的LiteralControl(“&lt; / li&gt;&lt; li&gt;”)),但这有点俗气。
您可以使用带有TemplateColumn的DataGrid来破解它,但这并不优雅。
为什么需要列入清单? CheckBoxList不提供您需要的功能吗?
另外,试试myCheckBox.Parent.Controls.FindControl(“MyHiddenField”)。值。
如何从父转发器中的隐藏字段控件访问类别ID,以便查找正确的RSS源?
答案 2 :(得分:0)
我有一个应用程序,我需要动态创建各种不同的控件。它适用于多个复选框(或其他任何事情)。
首先,在ASPX页面上,放置“PlaceHolder”控件:
<asp:PlaceHolder runat="server" id="CtrlCanvas" />
现在,在您的代码中,动态创建控件:
Label aLbl = new Label {Text = "Prompt: ", ID = ("WSLabel" + counter++)};
CtrlCanvas.Controls.Add(aLbl);
这是一个标签,这是一个TextBox:
TextBox aBox = new TextBox {ID = "XTest1", Columns = 5, Text = " ", Width = 50};
CtrlCanvas.Controls.Add(aBox);
aBox.Focus();
这是一个收音机列表:
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”。这是一个例子:
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;
}
}
现在要获取存储在特定控件中的值很容易:
string result = Form.Get(CtlPrefix + "XTest1")
对于无线电盒,至少Get会返回所选索引。我想你会单独给每个复选框命名,这样你就可以检查0或1。
希望这有帮助!
答案 3 :(得分:0)
我需要标记在语义上正确,并且无法使用控制适配器。
您指的是these adapters吗?如果没有,你应该看看。你不必使用整套;编辑.browser文件以仅指定CheckBoxListAdapter
。它应该完全符合你的需要。这样,您只需使用Repeater
或ListView
控件并将其数据绑定到类别列表,然后将CheckBoxList
放入其中。