Ver Mensaje Individual
  #1 (permalink)  
Antiguo 24/07/2007, 11:58
Avatar de Jackpat
Jackpat
 
Fecha de Ingreso: noviembre-2004
Mensajes: 55
Antigüedad: 20 años, 5 meses
Puntos: 0
Personalizar Gridview con Collections Generic

Bueno amigos les quiero pedir su ayuda lo que pasa que tengo un codigo para personalizar un gridview y que soporta un array de objetos para desplegarlos en un gridview, el cual es el siguiente:

Código PHP:
namespace CustomControls
{
    public class 
GridViewEx GridView
    
{
        
#region Array Comparer

        
private class ArrayComparer IComparer
        
{
            private 
string sortedPropertyName null;
            private 
SortDirection sortDirection SortDirection.Ascending;

            public 
ArrayComparer(string sortedPropertyNameSortDirection sortDirection)
            {
                
this.sortedPropertyName sortedPropertyName;
                
this.sortDirection sortDirection;
            }


            
#region IComparer Members

            
public int Compare(object xobject y)
            {
                
PropertyInfo prop x.GetType().GetProperty(sortedPropertyName);
                
                if (
prop == null)
                    throw new 
Exception(string.Format("Incorrect property to sort: {0}"sortedPropertyName));

                
object xValue prop.GetValue(xnull);
                
object yValue prop.GetValue(ynull);

                if (
xValue == null || yValue == null)
                    throw new 
Exception(string.Format("Failed to sort by {0}"sortedPropertyName));

                if (
sortDirection == SortDirection.Ascending)
                    return ((
IComparable)xValue).CompareTo(((IComparable)yValue));
                else
                    return ((
IComparable)yValue).CompareTo(((IComparable)xValue));
            }

            
#endregion
        
}

        
#endregion

        #region Event Handlers

        
protected override void OnInit(EventArgs e)
        {
            
base.OnInit(e);
            
this.Sorting += new GridViewSortEventHandler(GridViewEx_Sorting);
            
this.PageIndexChanging += new GridViewPageEventHandler(GridViewEx_PageIndexChanging);
        }

        
void GridViewEx_PageIndexChanging(object senderGridViewPageEventArgs e)
        {
            
this.PageIndex e.NewPageIndex;
            
            
BindDataSource();
        }

        
void GridViewEx_Sorting(object senderGridViewSortEventArgs e)
        {
            if (
PrevSortExpression == e.SortExpression)
            {
                
e.SortDirection SortDirection.Descending;
                
PrevSortExpression null;
            }
            else
                
PrevSortExpression e.SortExpression;
            
CurrentSortExpression e.SortExpression;
            
CurrentSortDirection e.SortDirection;
            
ChangeHeaders(this.HeaderRow);

            
BindDataSource();
        }

        
#endregion

        #region Private

        
private void ChangeHeaders(GridViewRow headerRow)
        {
            for (
int i 0headerRow.Cells.Counti++)
            {
                if (
headerRow.Cells[iis DataControlFieldCell)
                {
                    
DataControlField field = ((DataControlFieldCell)headerRow.Cells[i]).ContainingField;

                    
Regex r = new Regex(@"\s(\u25bc|\u25b2)");
                    
field.HeaderText r.Replace(field.HeaderText"");

                    if (
field.SortExpression != null && field.SortExpression == CurrentSortExpression)
                    {
                        if (
CurrentSortDirection == SortDirection.Ascending)
                            
field.HeaderText += " \u25b2";
                        else
                            
field.HeaderText += " \u25bc";
                    }
                }
            }
        }

        private 
string PrevSortExpression
        
{
            
get
            
{
                if (
ViewState["PrevSortExpression"] == null)
                    return 
null;
                return (string)
ViewState["PrevSortExpression"];
            }
            
set
            
{
                
ViewState["PrevSortExpression"] = value;
            }
        }

        private 
string CurrentSortExpression
        
{
            
get
            
{
                if (
ViewState["CurrentSortExpression"] == null)
                    return 
null;
                return (string)
ViewState["CurrentSortExpression"];
            }
            
set
            
{
                
ViewState["CurrentSortExpression"] = value;
            }
        }

        private 
SortDirection CurrentSortDirection
        
{
            
get
            
{
                if (
ViewState["CurrentSortDirection"] == null)
                    return 
SortDirection.Ascending;
                return (
SortDirection)ViewState["CurrentSortDirection"];
            }
            
set
            
{
                
ViewState["CurrentSortDirection"] = value;
            }
        }


        
#endregion

        #region Public 

        /// <summary>
        /// Binds the data source to the GridView control.
        /// </summary>
        
public void BindDataSource()
        {
            Array 
dataSource null;
            if (
DataSourceRequested != null)
                
DataSourceRequested(out dataSource);

            if (
dataSource == null)
                throw new 
Exception("Failed to get data source.");

            if (
CurrentSortExpression != null)
            {
                
ArrayList ar = new ArrayList(dataSource);
                
ar.Sort(new ArrayComparer(CurrentSortExpressionCurrentSortDirection));
                
dataSource ar.ToArray();
            }

            
base.DataSource dataSource;
            
base.DataBind();
        }

        
/// <summary>
        /// Occurs when the data source is requested.
        /// </summary>
        
public event DataSourceRequestedEventHandler DataSourceRequested;

        
#endregion
    
}

    
/// <summary>
    /// Represents the method that handles the DataSourceRequested event of a GridView control. 
    /// </summary>
    /// <param name="dataSource">Array of the objects.</param>
    
public delegate void DataSourceRequestedEventHandler(out Array dataSource);

y su utilización:

Código PHP:
    #region Event Handlers

    
protected void Page_Load(object senderEventArgs e)
    {
        if (!
IsPostBack)
            
gv.BindDataSource();

    }
    protected 
void gv_DataSourceRequested(out Array dataSource)
    {
        
dataSource GetTestData();
    }

    
#endregion

    #region Private

    
private ProductInfo[] GetTestData()
    {
        
ProductInfo[] res = new ProductInfo[8];
        
res[0] = new ProductInfo("TV-Tuner"140.00);
        
res[1] = new ProductInfo("Modem"219.00);
        
res[2] = new ProductInfo("Motherbord"1120.00);
        
res[3] = new ProductInfo("Keyboard"185.00);
        
res[4] = new ProductInfo("Mouse"254.99);
        
res[5] = new ProductInfo("Mouse pad"301.50);
        
res[6] = new ProductInfo("Monitor"4234.00);
        
res[7] = new ProductInfo("Fan"108.00);
        return 
res;
    }

    
#endregion 
ahora la idea es que se pueda trabajar con collections.Generics, lo he intentado de hacer pero no he logrado que funcione por eso recurro a ustedes para que por ultimo entre todos lo intentemos de hacer.... y para que no se crea que quiero que me hagan la pega aca un ejemplo de lo que he intentado hacer jejeeje....

Código PHP:
   #region Event Handlers

    
protected void Page_Load(object senderEventArgs e)
    {
        if (!
IsPostBack)
            
gv.BindDataSource();

    }
    protected 
void gv_DataSourceRequested(out List<ProductInfodataSource)
    {
        
dataSource GetTestData();
    }

    
#endregion

    #region Private

    
private ProductInfoCollection<ProductInfoGetTestData()
    {
        
ProductInfoCollection<ProductInfores = new ProductInfoCollection<ProductInfo>();
        
res.Add(new ProductInfo("TV-Tuner"140.00));
        
res.Add(new ProductInfo("Modem"219.00));
        
res.Add(new ProductInfo("Motherbord"1120.00));
        
res.Add(new ProductInfo("Keyboard"185.00));
        
res.Add(new ProductInfo("Mouse"254.99));
        
res.Add(new ProductInfo("Mouse pad"301.50));
        
res.Add(new ProductInfo("Monitor"4234.00));
        
res.Add(new ProductInfo("Fan"108.00));
        return 
res;
    }

    
#endregion 
bueno de la otra parte del codigo estoy es lo unico que tengo la implementacion del IComparer con Generics:
Código PHP:
        #region Generic Comparer

        
public class GenericComparer<T> : IComparer<T>
        {
            private 
string sortExpression;
            private 
SortDirection sortDirection;

            public 
SortDirection SortDirection
            
{
                
get { return this.sortDirection; }
                
set this.sortDirection value; }
            }

            public 
GenericComparer() { }

            public 
GenericComparer(string sortExpressionSortDirection sortDirection)
            {
                
this.sortExpression sortExpression;
                
this.sortDirection sortDirection;
            }

            
#region IComparer Members

            
public int Compare(T xT y)
            {
                
PropertyInfo propertyInfo typeof(T).GetProperty(sortExpression);
                
IComparable obj1 = (IComparable)propertyInfo.GetValue(xnull);
                
IComparable obj2 = (IComparable)propertyInfo.GetValue(ynull);
                if (
SortDirection == SortDirection.Ascending)
                {
                    return 
obj1.CompareTo(obj2);
                }
                else return 
obj2.CompareTo(obj1);

            }
            
#endregion
        

        
        
#endregion 
Bueno esperando que me puedan ayudar, de antemano graxxxxx :D
__________________
No abras los labios si no estás seguro de lo que vas a decir, es más hermoso que el silencio.