繼承 DataControlField 實作 RadioButtonSelectField,支援:
value,未指定時用 RowIndex。[AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal)]
public class RadioButtonSelectField : DataControlField
{
public string RadioButtonGroupName { get; set; }
public string RadioButtonCssClass { get; set; }
public string DataField { get; set; }
public string DataFormatString { get; set; }
protected override DataControlField CreateField() => this;
public override void InitializeCell(DataControlFieldCell cell, DataControlCellType cellType, DataControlRowState rowState, int rowIndex)
{
base.InitializeCell(cell, cellType, rowState, rowIndex);
if (cellType == DataControlCellType.DataCell)
{
var lit = new Literal();
if (string.IsNullOrEmpty(DataField))
SetLiteralHtml(lit, rowIndex.ToString());
else
lit.DataBinding += Literal_DataBinding;
cell.Controls.Add(lit);
}
}
void Literal_DataBinding(object sender, EventArgs e)
{
var lit = (Literal)sender;
var cell = lit.Parent as TableCell;
var container = lit.NamingContainer;
bool found;
object dataItem = DataBinder.GetDataItem(container, out found);
if (!found) return;
string val = DataField.Contains(".")
? DataBinder.Eval(dataItem, DataField, DataFormatString).ToString()
: DataBinder.GetPropertyValue(dataItem, DataField, DataFormatString).ToString();
SetLiteralHtml(lit, val);
}
void SetLiteralHtml(Literal lit, string dataValue)
{
string group = string.IsNullOrEmpty(RadioButtonGroupName)
? lit.Parent.Parent.Parent.Parent.ID
: RadioButtonGroupName;
string css = string.IsNullOrEmpty(RadioButtonCssClass) ? "" : $"class=\"{RadioButtonCssClass}\"";
bool selected = false;
string posted = lit.Page.Request[group];
if (!string.IsNullOrEmpty(posted) && string.Equals(posted, dataValue, StringComparison.OrdinalIgnoreCase))
selected = true;
lit.Text = $"<input type=\"radio\" name=\"{group}\" value=\"{dataValue}\" {css} {(selected ? "checked" : "")} />";
}
}
<cc1:RadioButtonSelectField DataField="UserID" RadioButtonGroupName="grpUser" HeaderText="選取" />