asp.net 扩展GridView 增加单选按钮列的代码

复制代码 代码如下:

  /// <summary>

  /// 单选按钮列

  /// </summary>

  /// <remarks>

  /// 如果没有设置GroupName,则使用GridView的ID作为GroupName

  /// 如果没有设置DataField,则使用RowIndex作为Value

  /// 允许设置DataFormatString格式化数据

  /// </remarks>

  [AspNetHostingPermission(SecurityAction.Demand,

  Level = AspNetHostingPermissionLevel.Minimal)]

  public class RadioButtonSelectField : DataControlField

  {

  /// <summary>

  /// 单选按钮组名,默认去GridView的ClientID

  /// </summary>

  [Description("单选按钮组名,默认去GridView的ClientID")]

  public string RadioButtonGroupName

  {

  get

  {

  return this.ViewState["RadioButtonGroupName"] as string;

  }

  set

  {

  this.ViewState["RadioButtonGroupName"] = value;

  }

  }

  /// <summary>

  /// 单选按钮的样式

  /// </summary>

  [Description("单选按钮的样式")]

  public string RadioButtonCssClass

  {

  get

  {

  return this.ViewState["RadioButtonCssClass"] as string;

  }

  set

  {

  this.ViewState["RadioButtonCssClass"] = value;

  }

  }

  /// <summary>

  /// 要绑定的数据表达式

  /// </summary>

  [Description("要绑定的数据表达式")]

  public string DataField

  {

  get

  {

  return this.ViewState["DataField"] as string;

  }

  set

  {

  this.ViewState["DataField"] = value;

  }

  }

  /// <summary>

  /// 要绑定的数据表达式格式

  /// </summary>

  [Description("要绑定的数据表达式格式")]

  public string DataFormatString

  {

  get

  {

  return this.ViewState["DataFormatString"] as string;

  }

  set

  {

  this.ViewState["DataFormatString"] = value;

  }

  }

  /// <summary>

  /// return self;

  /// </summary>

  /// <returns></returns>

  protected override DataControlField CreateField()

  {

  return this;

  }

  /// <summary>

  /// 添加控件

  /// </summary>

  /// <param name="cell"></param>

  /// <param name="cellType"></param>

  /// <param name="rowState"></param>

  /// <param name="rowIndex"></param>

  public override void InitializeCell(DataControlFieldCell cell, DataControlCellType cellType, DataControlRowState rowState, int rowIndex)

  {

  base.InitializeCell(cell, cellType, rowState, rowIndex);

  if (cellType == DataControlCellType.DataCell)

  {

  var literal = new Literal();

  if (string.IsNullOrEmpty(this.DataField))

  {

  SetLiteralHtml(literal, rowIndex.ToString());

  }

  else

  {

  literal.DataBinding += new EventHandler(literal_DataBinding);

  }

  cell.Controls.Add(literal);

  }

  }

  void literal_DataBinding(object sender, EventArgs e)

  {

  if (string.IsNullOrEmpty(this.DataField))

  {

  return;

  }

  var literal = sender as Literal;

  if (literal == null)

  {

  return;

  }

  var cell = literal.Parent as TableCell;

  if (cell == null)

  {

  return;

  }

  var container = literal.NamingContainer;

  if (container == null)

  {

  return;

  }

  bool foundDataItem;

  var dataItem = DataBinder.GetDataItem(container, out foundDataItem);

  if (!foundDataItem)

  {

  return;

  }

  var dataValue = null as string;

  if (this.DataField.Contains('.'))

  {

  dataValue = DataBinder.Eval(dataItem, this.DataField, this.DataFormatString);

  }

  else

  {

  dataValue = DataBinder.GetPropertyValue(dataItem, this.DataField, this.DataFormatString);

  }

  SetLiteralHtml(literal, dataValue);

  }

  private void SetLiteralHtml(Literal literal, string dataValue)

  {

  var groupName = this.RadioButtonGroupName;

  if (string.IsNullOrEmpty(groupName))

  {

  groupName = literal.Parent.Parent.Parent.Parent.ID;

  }

  var cssClass = this.RadioButtonCssClass;

  if (!string.IsNullOrEmpty(cssClass))

  {

  cssClass = string.Format("class=\"{0}\"", this.RadioButtonCssClass);

  }

  var selected = false;

  var selectedValue = literal.Page.Request[groupName];

  if (string.IsNullOrEmpty(selectedValue) == false)

  {

  if (string.Compare(selectedValue, dataValue, true) == 0)

  {

  selected = true;

  }

  }

  var rbHtml = string.Format("<input type=\"radio\" name=\"{0}\" value=\"{1}\" {2} {3} />",

  groupName,

  dataValue,

  cssClass,

  selected ? "checked" : string.Empty);

  literal.Text = rbHtml;

  }

  }