自己写的Gridview用户控件,实现了动态生成列;当行数不足n时,添加空白行;处理了Gridview行的鼠标事件。
public partial class GridViewPro : System.Web.UI.UserControl
{
private const int n = 20; //默认显示的行数
private IEnumerable _DataSource;
/// <summary>
///Gridview的数据源属性。
/// </summary>
public IEnumerable DataSource
{
set
{
_DataSource = value;
}
}
private string[] _Head;
/// <summary>
/// Gridview的表头属性。
/// </summary>
public string[] Head
{
set
{
_Head = value;
}
}
private string[] _Field;
/// <summary>
/// 设置Gridview的绑定的列名。
/// </summary>
public string[] Field
{
set
{
_Field = value;
}
}
private string _Key;
/// <summary>
/// Gridview的主键属性。
/// </summary>
public string Key
{
set
{
_Key = value;
}
}
private string _Href;
/// <summary>
/// Gridview双击行时跳转地址属性。
/// </summary>
public string Href
{
set
{
_Href = value;
}
}
protected void Page_Load(object sender, EventArgs e)
{
}
/// <summary>
/// Gridview绑定
/// </summary>
public void Databind()
{
GridView1.DataSource = _DataSource;
GridView1.DataKeyNames = new string[] { _Key };
BoundField bf = null;
GridView1.Columns.Clear();
GridView1.AutoGenerateColumns = false;
for (int i = 0; i < _Head.Length; i++)
{
bf = new BoundField();
bf.HeaderText = _Head[i];
bf.DataField = _Field[i];
GridView1.Columns.Add(bf);
GridView1.Columns[i].ItemStyle.Width = 150;
}
GridView1.DataBind();
//当数据为空时添加空行
if (GridView1.Rows.Count == 0)
{
DataTable dt = new DataTable(); //定义一个表,当DataSource为空时绑定之,否则,Gridview控件就不能显示
DataRow dr;
for (int i = 0; i < _Head.Length; i++)
{
dt.Columns.Add(new DataColumn(_Field[i], typeof(string)));//dt的列必须保持与Gridview一致
dr = dt.NewRow();
dr[i] = " ";
}
dt.Columns.Add(new DataColumn(_Key, typeof(string)));
dr = dt.NewRow();
dr[_Head.Length] = " ";
dt.Rows.Add(dr);
GridView1.DataSource = dt;
GridView1.DataBind();
}
}
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
//判断是否是DataRow
if (e.Row.RowType == DataControlRowType.DataRow)
{
string SelectID = GridView1.DataKeys[e.Row.RowIndex].Value.ToString();//((ClientList)(e.Row.DataItem)).ClientID;
if (!String.IsNullOrEmpty(SelectID)) //如果行为空,就禁用鼠标事件
{
//鼠标双击Row时的效果
e.Row.Attributes.Add("ondblclick", "javascript:window.location.href='"+_Href+"?ID=" + SelectID+ "';");
//鼠标经过Row时的效果
e.Row.Attributes.Add("onmouseover", "this.classname=onColor2(this)");
//鼠标离开Row时的效果
e.Row.Attributes.Add("onmouseout", "this.classname=offColor2(this)");
//鼠标键Row时的效果
e.Row.Attributes.Add("onmousedown", "this.classname=downColor(this," + SelectID + ")");
}
}
if (e.Row.RowType == DataControlRowType.Footer)
{
//当Gridview行不足n时,填充空白行
for (int i = 0; i < n - GridView1.Rows.Count; i++)
{
int rowIndex = GridView1.Rows.Count + i + 1;
GridViewRow row = new GridViewRow(rowIndex, -1, DataControlRowType.EmptyDataRow, DataControlRowState.Normal);
for (int j = 0; j < GridView1.Columns.Count; j++)
{
TableCell cell = new TableCell();
cell.Text = " ";
row.Controls.Add(cell);
row.Attributes.Add("BorderColor ", "#d2d2d2");
}
GridView1.Controls[0].Controls.AddAt(rowIndex, row);
}
}
e.Row.Attributes.Add("BorderColor ", "#d2d2d2");
}
}
有个很大的不足之处就是当调用页面触发事件时,属性的值就没了,你需要每次在触发事件时再赋值。
可以把属性用视图状态ViewState来设置,这样就不必每次都要赋值了
public string Key
{
set
{
ViewState["Key"] = value;
}
}
GridView1.DataKeyNames = (string)ViewState["Key"] ;
以下是调用页面:
public partial class VendorList : System.Web.UI.Page
{
private BFLList Blist;
private IQueryable<myInfoList> VList;
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
Blist = new BFLList();
VList = Blist.GetVendorAll();
GridInit();
}
}
private void GridInit()
{
GridViewPro1.DataSource = VList;
GridViewPro1.Key = "ID";
GridViewPro1.Href = "VendorEdit.aspx";
string[] Head = new string[]
{
"编码",
"供应商简称",
"地区",
"类型"
};
string[] Field = new string[]
{
"Code",
"ShortName",
"AreaName",
"TypeName"
};
GridViewPro1.Head = Head;
GridViewPro1.Field = Field;
GridViewPro1.Databind();
}