扩展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;
        }
    }

 

posted @ 2010-02-25 14:27  karoc  阅读(625)  评论(0编辑  收藏  举报