NewRow GridView

分享于 

7分钟阅读

Web开发

  繁體

Sample Image

介绍

你是否希望将可以编辑行添加到 GridView,但不希望自定义页脚或者操作数据源的麻烦? 如果是这种情况,也许 NewRowGridView 是你的选择。

使用代码

你将在演示项目中找到几个文件,其中 NewRowGridView 是最重要的。 这里,我们使用 GridView 自己的方法扩展已知的GridView 组件,并使用自己的方法创建这些。 我们使用 NewRows 属性公开新创建的行。 我们还添加一个属性 NewRowCount,它确定要添加到 GridView 中的可以编辑行的数目。 当用户更改新创建的行中的数据时,我们可以通过 NewRowsChanged 属性访问这些数据。

private GridViewRowCollection _newRows;private List <int> _changedRows;//[Browsable(false)]public GridViewRowCollection NewRows
{
 get {
 return (this._newRows == null)? new 
 GridViewRowCollection(new ArrayList()) : 
 this._newRows;
 }
}//publicint NewRowCount
{
 get {
 object viewState = this.ViewState["NewRowCount"];
 return (viewState == null)? 0 : (int)viewState;
 }
 set { this.ViewState["NewRowCount"] = value; }
}//[Browsable(false)]public GridViewRowCollection NewRowsChanged
{ 
 get {
 if (this._changedRows!= null)
 {
 ArrayList changedRows = new ArrayList();
 foreach (int rowIndex inthis._changedRows)
 {
 changedRows.Add(this._newRows[rowIndex]);
 }
 returnnew GridViewRowCollection(changedRows);
 }
 returnnew GridViewRowCollection(new ArrayList());
 }
}

创建行时,我们将使用 GridViewCreateRowInitializeRow 方法。 除其他外,CreateRow 方法还需要 DataControlRowState 属性。 通过将它的设置为 Insert,行将使用类似 TextBox 或者 CheckBox的可以编辑组件进行初始化。 数据信息将通过 GetDataFields 方法收集。

private DataControlField[] GetDataControlFields()
{
 DataControlField[] fields = 
 new DataControlField[this.Columns.Count];
 base.Columns.CopyTo(fields, 0);
 return fields;
}//private GridViewRow CreateNewRow(int rowIndex, DataControlField[] fields)
{
 GridViewRow newRow = base.CreateRow(rowIndex, -1, 
 DataControlRowType.DataRow, 
 DataControlRowState.Insert);
 base.InitializeRow(newRow, fields);
 this.AddRowChanged(newRow);
 return newRow;
}

在新行中,AddRowChanged 方法将事件处理程序添加到新创建的控件中,这些控件在这些控件的状态发生更改时激发。 然后将新行的RowIndex 添加到 _changedRow 列表中,以便进一步参考。

privatevoid AddRowChanged(Control control)
{
 foreach (Control ctr in control.Controls)
 {
 if (ctr is TextBox)
 {
 ((TextBox)ctr).TextChanged += 
 new EventHandler(this.RowChanged);
 }
 elseif (ctr is ListControl)
 {
 ((ListControl)ctr).SelectedIndexChanged += 
 new EventHandler(this.RowChanged);
 }
 elseif (ctr is CheckBox)
 {
 ((CheckBox)ctr).CheckedChanged += 
 new EventHandler(this.RowChanged);
 }
 if (ctr.HasControls())
 {
 this.AddRowChanged(ctr);
 }
 }
}privatevoid RowChanged(object sender, EventArgs e)
{
 GridViewRow row = 
 (GridViewRow)((Control)sender).NamingContainer;
 if (this._changedRows == null)
 {
 this._changedRows = new List <int>();
 }
 if (!this._changedRows.Contains(row.RowIndex))
 {
 this._changedRows.Add(row.RowIndex);
 }
}

GridView 呈现到浏览器时,它基本上只是一个 Table。 通过调用某行的Parent 属性可以找到表,或者在没有数据时,我们通过调用 GridViewCreateChildTable 方法创建自己的数据。 在后一种情况下,我们还必须将表添加到 GridViewControlCollection的。 如果没有数据( 行),则 GridView 将自动隐藏页眉和页脚。 在这种情况下,我们必须以创建可以插入行的方式创建头行,但 DataControlRowState 属性设置为 Normal

privatevoid CreateRows()
{
 if (this.NewRowCount >0)
 {
 ArrayList list = new ArrayList();
 DataControlField[] fields = this.GetDataControlFields();
 for (int i = 0; i <this.NewRowCount; i++)
 {
 GridViewRow newRow = this.CreateNewRow(i, fields);
 list.Add(newRow);
 }
 this._newRows = new GridViewRowCollection(list);
 Table grid;
 if (this.Rows.Count == 0)
 {
 grid = this.CreateChildTable();
 this.Controls.Add(grid);
 if (this.ShowHeader)
 {
 GridViewRow headerRow = 
 this.CreateHeaderRow(fields);
 grid.Rows.Add(headerRow);
 }
 }
 else {
 grid = (Table)this.Rows[0].Parent;
 }
 int rowIndex = this.Rows.Count + 1;
 foreach (GridViewRow newRow inthis._newRows)
 {
 grid.Rows.AddAt(rowIndex, newRow);
 rowIndex++;
 }
 }
}private GridViewRow CreateHeaderRow(DataControlField[] fields)
{
 GridViewRow headerRow = base.CreateRow(-1, -1, 
 DataControlRowType.Header, DataControlRowState.Normal);
 base.InitializeRow(headerRow, fields);
 return headerRow;
}

最后一步是调用 CreateRows 方法。 因此,我们必须重写 CreateChildControls 方法。

protectedoverrideint CreateChildControls(IEnumerable 
 dataSource, bool dataBinding)
{
 int rowCount = base.CreateChildControls(dataSource, 
 dataBinding);
 this.CreateNewRows();
 return rowCount;
}

就是这样现在你可以通过 NewRows 集合访问新值,并且通过 NewRowsChanged 集合来访问已经更改的值。


GRID  Gridview  newrow  
相关文章