博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

通过反射搞定GridViewCollection 的添加新的GridViewRow问题

Posted on 2006-10-09 00:03  liufu627  阅读(665)  评论(1)    收藏  举报
<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    
<title>无标题页</title>
</head>
<body>
    
<form id="form1" runat="server">
    
<div>
    
<asp:GridView ID="gvMain" runat="server" AutoGenerateColumns="false"  >
    
<Columns>
     
<asp:TemplateField>
      
<ItemTemplate>
        
<asp:Label ID="lblCode"  runat="server"  Text='<%# Eval("Code") %>' ></asp:Label>
      
</ItemTemplate>
      
<EditItemTemplate>
        
<asp:DropDownList ID="ddlCode"  runat="server" DataValueField="Code" DataTextField="Code"></asp:DropDownList>
        
<asp:HiddenField ID="hfCode" Value='<%# Eval("Code") %>'  runat="server" />
         
</EditItemTemplate>
      
<HeaderTemplate>Code</HeaderTemplate>
     
</asp:TemplateField>
     
<asp:TemplateField>
        
<ItemTemplate>
         
<asp:Button ID="btnEdit" Text="Edit" runat="server" />
         
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<asp:Button ID="btnDelete" Text="Delete" runat="server" />
        
</ItemTemplate>
        
<EditItemTemplate>
          
<asp:Button ID="btnUpdate" Text="Update" CommandName="Update" runat="server" />
          
<asp:Button ID="btnCancel" Text="Cancel" CommandName="Cancel" runat="server" />
        
</EditItemTemplate>
        
<HeaderTemplate>Action</HeaderTemplate>
     
</asp:TemplateField>
    
</Columns>
    
</asp:GridView>
    
</div>
    
</form>
</body>
</html>
以下后台代码
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections.Generic;
using System.Reflection;

public partial class _Default : System.Web.UI.Page 
{
    
protected void Page_Load(object sender, EventArgs e)
    
{
        
        
if( Page.IsPostBack == false )
        
{
            
this.gvMain.DataSource = GetData( );
            
this.gvMain.DataBind( );
        }
      
        AddMarket( );
    }


    
private void AddMarket(  )
    
{
        GridViewRow row 
= new GridViewRow( this.gvMain.Rows.Count , this.gvMain.Rows.Count , DataControlRowType.Separator , DataControlRowState.Normal );
        
foreach( DataControlField dataColumn in gvMain.Columns )
        
{

            DataControlFieldCell cell 
= new DataControlFieldCell( dataColumn );

            dataColumn.InitializeCell( cell , DataControlCellType.DataCell , DataControlRowState.Normal , 
this.gvMain.Rows.Count );

            Label lblCode 
= null;
            
foreach( Control control in cell.Controls )
            
{
                
if( control == null || control.UniqueID == null )
                    
continue;
                
if( control.UniqueID.Trim( ).ToUpper( ) == "lblCode".Trim( ).ToUpper( ) )
                
{
                    lblCode 
= ( Label ) control;
                }

            }



            
if( lblCode != null )
            
{
                lblCode.Text 
= "Liufu";
            }

            row.Cells.Add( cell );
            
//row.Parent =  this.gvMain.Rows [0].Parent;
            this.gvMain.Rows [0].Parent.Controls.Add( row );
        }

        Table tb 
= ( Table ) gvMain.Controls [0];
        tb.Rows.AddAt( gvMain.Rows.Count 
+ 1 , row );
        
this.gvMain.FooterRow.Parent.Controls.AddAt( 0 , row );
        
this.SaveControlState( );
        
this.SaveViewState( );
        GridViewRow [] rows 
= new GridViewRow [gvMain.Rows.Count + 1 ];
        rows [rows.Length 
- 1= row;
        
this.gvMain.Rows.CopyTo( rows , 0 );
        System.Collections.ArrayList list 
= new System.Collections.ArrayList( );
        
foreach( GridViewRow tmp in rows )
        
{
            list.Add( tmp );
        }

        
//    this._rowsCollection = new GridViewRowCollection(this._rowsArray);

        Type typeGridView 
= gvMain.GetType( );

        FieldInfo [] ms 
= typeGridView.GetFields( BindingFlags.DeclaredOnly | BindingFlags.NonPublic 
            
|                       BindingFlags.Instance | BindingFlags.CreateInstance
              );

        
foreach( FieldInfo m in ms )
        
{
            
if( m.Name.Trim( ).ToUpper( ) == "_rowsCollection".Trim( ).ToUpper( ) )
            
{
                m.SetValue( gvMain , 
new GridViewRowCollection( list ) );

            }


        }


    }

   

    
protected object GetData( )
    
{
        List
<TestSource> lists = new List<TestSource>( );
        
int length = 10;
        
forint i = 0 ; i < length ; i++ )
        
{
            TestSource t 
= new TestSource( );
            t.Code 
= string.Format( "Code{0}{0}{0}{0}" , i );
            lists.Add( t );
        }

        
return lists;
    }

    
public class TestSource
    
{
        
private string code;

        
public string Code
        
{
            
get
            
{
                
return code;
            }

            
set
            
{
                code 
= value;
            }

        }


    }

}


public class Test
{
    
public string test = "test";

    
void Foo( )
    
{
        test 
= "Foo";
    }


}