gpt4 book ai didi

c# - 使用嵌套的 div 而不是表或流来渲染 RadioButtonList

转载 作者:技术小花猫 更新时间:2023-10-29 12:03:08 26 4
gpt4 key购买 nike

我在 C#.NET 3.5 中以编程方式生成单选按钮列表,并使用 RadioButtonList 来执行此操作。但是,令我感到非常沮丧的是 RepeatLayout 属性,它只能设置为 FlowTable

表格用于表格数据,而不是用于显示表格。流动性没有帮助,因为它不适合造型。

我真正想要的是可以用 CSS 处理的 div 嵌套。这能做到吗?

一些示例来说明我在说什么,下面是示例代码。

流程示例

<span id="s1">
<input id="s1_0" type="radio" value="Answer A" name="s1">
<label for="s1_0">Answer A</label>
<br>
<input id="s1_1" type="radio" value="Answer B" name="s1">
<label for="s1_1">Answer B</label>
</span>

表格示例

<table border="0" id="s1">
<tbody>
<tr>
<td><input type="radio" value="Answer A" name="s1" id="s1_0"><label for="s1_0">Answer A</label></td>
</tr>
<tr>
<td><input type="radio" value="Answer B" name="s1" id="s1_1"><label for="s1_1">Answer B</label></td>
</tr>
</tbody>
</table>

我真正想要的

<div id="s1">
<div>
<input type="radio" value="Answer A" name="s1" id="s1_0">
<label for="s1_0">Answer A</label>
</div>
<div>
<input type="radio" value="Answer B" name="s1" id="s1_1">
<label for="s1_1">Answer B</label>
</div>
</div>

我用来生成列表的 C# 代码

我知道无论解决方案是什么,都不会像这个一样快速和简单,但我把它放在这里是为了让您了解我使用它的上下文。

RadioButtonList rbl = new RadioButtonList { RepeatLayout = RepeatLayout.Table };
foreach (ControlValue cv in MasterControl.listControlValues)
{
rbl.Items.Add(new ListItem(cv.name, cv.value));
}
ControlContainer.Controls.Add(rbl);

最佳答案

您可能想使用 WebControlAdapter更改 RadioButtonList 的呈现方式。

以下是您案例的完整代码:

public class RadioButtonListAdapter : WebControlAdapter
{
protected override void RenderBeginTag(HtmlTextWriter writer)
{
writer.RenderBeginTag("div");
}

protected override void RenderEndTag(HtmlTextWriter writer)
{
writer.RenderEndTag();
}

protected override void RenderContents(HtmlTextWriter writer)
{
var adaptedControl = (RadioButtonList) Control;
int itemCounter = 0;

writer.Indent++;
foreach (ListItem item in adaptedControl.Items)
{
var inputId = adaptedControl.ClientID + "_" + itemCounter++;

// item div
writer.RenderBeginTag("div");
writer.Indent++;

// input
writer.AddAttribute("type", "radio");
writer.AddAttribute("value", item.Value);
writer.AddAttribute("name", adaptedControl.ClientID);
writer.AddAttribute("id", inputId);

if (item.Selected)
{
writer.AddAttribute("checked", "checked");
}

writer.RenderBeginTag("input");
writer.RenderEndTag();

// label
writer.AddAttribute("for", inputId);

writer.RenderBeginTag("label");

writer.Write(item.Value);

writer.RenderEndTag();

// div
writer.Indent--;
writer.RenderEndTag();
}
writer.Indent--;
}
}

要将此适配器连接到您的应用程序,您有两种选择。首先是在页面 constructor 中以编程方式执行此操作:

var adapters = Context.Request.Browser.Adapters;
var radioButtonListType = typeof(RadioButtonList).AssemblyQualifiedName;
var adapterType = typeof(RadioButtonListAdapter).AssemblyQualifiedName;
if (!adapters.Contains(radioButtonListType))
{
adapters.Add(radioButtonListType, adapterType);
}

第二个选项是使用 .browser 文件:

向您的元素添加新的浏览器文件。它将驻留在 App_Browsers 文件夹中。然后用以下声明替换内容:

<browsers>
<browser refID="Default">
<controlAdapters>
<adapter controlType="System.Web.UI.WebControls.RadioButtonList"
adapterType="<your namespace>.RadioButtonListAdapter" />
</controlAdapters>
</browser>
</browsers>

作为引用,您可以使用 ScottGu 的帖子 ASP.NET 2.0 Control Adapter Architecture 中的链接他们可以为这个主题提供良好的基础。

还有一个开源的CSS Friendly Control Adapters解决默认 ASP.NET 控件的一些呈现问题的元素。

关于c# - 使用嵌套的 div 而不是表或流来渲染 RadioButtonList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14918438/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com