none
Problema con eventos de DataGridView RRS feed

  • Pregunta

  • Buenas tardes, 

    estoy teniendo un inconveniente con unos DataGridView. Aclaro que no tengo mucha experiencia usandolos con enlaces de datos. En un formulario tengo dos datagrid, a cada uno les tengo asignados como datasource dos bindinglist. En dicho from cargo con una función los bindinglist y todo va bien, los datagrid me muestran boen las columnas y demás. Debo acalarar que las dos listas las tengo llenas con el mismo tipo de objeto y que en uno de los datagrid oculto una de las columnas. La clase de esos objetos tienen puestas las propiedades necesarias para que repliquen los cambios en los datagrid. La cuestión es que a estos controles (datagrid) tienen asignados los eventos DataError, CellValidating y CellEndEdit, todos refiereren al mismo evento e identifico el control que lo llamó fijándome el nombre del objeto llamador del mismo, el problema radica en que en uno de los datagrid con solo darle el foco al control me dispara indefinidamente el evento CellEndEdit hasta que el programa frena por una excepción de overflow.

    En el evento CellEndEdit lo que hago es ordenar el bindinglist que tiene la tabla que llamó el evento mediante el método OrderBy de la lista y asignándole a la propiedad datasource del control la nueva lista ordenada. 

    Aquí pongo el código para ver si alguien puede darme una mano porque esto me está volviendo loco.

    Muchas gracias de antemano. 

    Saludos. 

    P.D.: En el código van a ver que asocié los BindingList a unos BindingSource. Me pareció que no iba a cambiar mucho la cosa... y así fué, no cambió nada. Antes de hacer eso como datasource estaban asignadas directamente los BindingLilst.

    /* Clase con la que se forman los objetos de las listas */
    /// <summary>
        /// Tipo de datos que representa a una masa
        /// </summary>
        public class Masa : IEquatable<Masa>, IComparable<Masa>, System.ComponentModel.INotifyPropertyChanged
        {
            double _valorMasa;
            int _tiempoIntegracion, _cantidadTomas;
            bool _esDeBloque;
    
            /// <summary>
            /// Indica si la masa corresponde a una línea de base de bloque o de ciclo
            /// </summary>
            [System.ComponentModel.DisplayName("B.L. bloque")]
            public bool EsBlDeBloque { get { return this._esDeBloque; } set { this._esDeBloque = value; NotifyPropertyChanged("EsBlDeBloque"); } }
    
            /// <summary>
            /// Obtiene o establece el valor numérico de la masa en UMA
            /// </summary>
            [System.ComponentModel.DisplayName("Masa")]
            public double ValorMasa { get { return _valorMasa; } set { _valorMasa = value; NotifyPropertyChanged("ValorMasa"); } }
    
            /// <summary>
            /// Obtiene o establece el promedio de la intensidad medida de la masa
            /// </summary>
            [System.ComponentModel.Browsable(false)]
            public double PromedioIntensidad { get; set; }
    
            /// <summary>
            /// Obtiene o establece un listado con las líneasa de base asociadas a la masa
            /// </summary>
            [System.ComponentModel.Browsable(false)]
            public List<string> LineasDeBaseAsociadas { get; set; }
    
            /// <summary>
            /// Obtiene o establece el Tiempo de integración con el que corresponde medir esta masa
            /// </summary>
            [System.ComponentModel.DisplayName("Tiempo integración")]
            public int TiempoDeIntegracion { get { return _tiempoIntegracion; } set { _tiempoIntegracion = value; NotifyPropertyChanged("TiempoDeIntegracion"); } }
    
            /// <summary>
            /// Obtiene o establece la cantidad de datos que se tomarán por cada vez que se haga una medición de esta masa
            /// </summary>
            [System.ComponentModel.DisplayName("Cant. datos")]
            public int CantidadDeTomas { get { return _cantidadTomas; } set { _cantidadTomas = value; NotifyPropertyChanged("CantidadDeTomas"); } }
    
            public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
    
            protected void NotifyPropertyChanged(string p)
            {
                if (PropertyChanged != null)
                    PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(p));
            }
    
            /// <summary>
            /// Tipo de dato que representa una Masa en UMA
            /// </summary>
            /// <param name="masa">Valor de la masa</param>
            public Masa(double masa, bool LBDeBloque)
            {
                this._esDeBloque = LBDeBloque;
                this.ValorMasa = masa;
                this.PromedioIntensidad = 0.00;
                this.LineasDeBaseAsociadas = new List<string>();
                this.TiempoDeIntegracion = 0;
                this.CantidadDeTomas = 0;
            }
    
            /// <summary>
            /// Tipo de dato que representa una Masa en UMA
            /// </summary>
            /// <param name="masa">Valor de la masa</param>
            /// <param name="promedioIntensidad">Intensidad promedio asociada a la masa</param>
            public Masa(double masa, double promedioIntensidad, bool LBDeBloque)
            {
                this._esDeBloque = LBDeBloque;
                this.ValorMasa = masa;
                this.PromedioIntensidad = promedioIntensidad;
                this.LineasDeBaseAsociadas = new List<string>();
                this.TiempoDeIntegracion = 0;
                this.CantidadDeTomas = 0;
            }
    
            /// <summary>
            /// Tipo de dato que representa una Masa en UMA
            /// </summary>
            /// <param name="masa">Valor de la masa</param>
            /// <param name="listaLineasBase">Listado de líneas de base asociadas a esta masa</param>
            public Masa(double masa, List<string> listaLineasBase, bool LBDeBloque)
            {
                this._esDeBloque = LBDeBloque;
                this.ValorMasa = masa;
                this.PromedioIntensidad = 0.00;
                this.LineasDeBaseAsociadas = listaLineasBase;
                this.TiempoDeIntegracion = 0;
                this.CantidadDeTomas = 0;
            }
    
            /// <summary>
            /// Tipo de dato que representa una Masa en UMA
            /// </summary>
            /// <param name="masa">Valor de la masa</param>
            /// <param name="promedioIntensidad">Intensidad promedio asociada a la masa</param>
            /// <param name="listaLineasBase">Listado de líneas de base asociadas a esta masa</param>
            public Masa(double masa, double promedioIntensidad, List<string> listaLineasBase, bool LBDeBloque)
            {
                this._esDeBloque = LBDeBloque;
                this.ValorMasa = masa;
                this.PromedioIntensidad = promedioIntensidad;
                this.LineasDeBaseAsociadas = listaLineasBase;
                this.TiempoDeIntegracion = 0;
                this.CantidadDeTomas = 0;
            }
    
            /// <summary>
            /// 
            /// </summary>
            /// <param name="obj"></param>
            /// <returns></returns>
            public override bool Equals(object obj)
            {
                if (obj == null) return false;
                
                Masa objeto = obj as Masa;
    
                if(objeto == null)
                    return false;
    
                return Equals(objeto);
            }
    
            /// <summary>
            /// 
            /// </summary>
            /// <param name="other"></param>
            /// <returns></returns>
            public bool Equals(Masa other)
            {
                if (other.ValorMasa == null || Double.IsNaN(other.ValorMasa)) return false;
                
                return (this.ValorMasa.Equals(other.ValorMasa));
            }
    
            /// <summary>
            /// 
            /// </summary>
            /// <param name="compareMasa"></param>
            /// <returns></returns>
            public int CompareTo(Masa compareMasa)
            {
                if (compareMasa == null) return 1;
    
                else
                    return this.ValorMasa.CompareTo(compareMasa.ValorMasa);
            }
    
            /// <summary>
            /// 
            /// </summary>
            /// <returns></returns>
            public override int GetHashCode()
            {
                return base.GetHashCode();
            }
    
            /// <summary>
            /// 
            /// </summary>
            /// <returns></returns>
            public override string ToString()
            {
                return this.ValorMasa + " UMA";
            }
    
    }
    
    
    private void frmConfiguracionTDM_Load(object sender, EventArgs e)
                {
                    this.btnEstablecerReferencia.Text = "REF:" + EMPTY_STRING_TXTMASA;
                
                    this.tablaMasas.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
                    this.tablaLineasDeBase.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
    
                    BindingSource bs1 = new BindingSource();
                    BindingSource bs2 = new BindingSource();
    
                    bs1.DataSource = this.listadoMasas;
                    bs2.DataSource = this.listadoMasasBase;
    
                    this.tablaMasas.DataSource = bs1;
                    this.tablaLineasDeBase.DataSource = bs2;
    
                    this.tablaMasas.Columns["EsBlDeBloque"].Visible = false;
    
                    this.CargarConfiguracionDeArchivo(Application.StartupPath + "\\default.cnf");
                }
     
    private void tabla_CellEndEdit(object sender, DataGridViewCellEventArgs e)
                {
                    DataGridView tabla = sender as DataGridView;
    
                    List<Masa> listaOrdenada;
    
                    if (tabla == null)
                        return;
    
                    if (tabla.Name == "tablaMasas")
                    {
                        listaOrdenada = this.listadoMasas.OrderBy(x => x.ValorMasa).ToList();
                        this.listadoMasas = new BindingList<Masa>(listaOrdenada);
                        ((BindingSource)this.tablaMasas.DataSource).DataSource = this.listadoMasas;
                    }
                    else
                    {
                        listaOrdenada = this.listadoMasasBase.OrderBy(y => y.ValorMasa).ToList();
                        this.listadoMasasBase = new BindingList<Masa>(listaOrdenada);
                        ((BindingSource)this.tablaLineasDeBase.DataSource).DataSource = this.listadoMasasBase;
                    }
                }
    
     private void tabla_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
                {
                    DataGridView tabla = sender as DataGridView;
    
                    if (tabla.CurrentCell.OwningColumn.Name == "ValorMasa")
                    {
                        for(int i = 0; i < tabla.Rows.Count; i++)
                        {
                            DataGridViewRow row = tabla.Rows[i];
    
                            if (row.Cells[tabla.CurrentCell.ColumnIndex].Value.ToString() == e.FormattedValue.ToString() && row.Index != tabla.CurrentCell.RowIndex)
                            {
                                tabla.Rows[e.RowIndex].ErrorText =
                                    "Valores duplicados no permitidos";
    
                                e.Cancel = true;
    
                                i = tabla.Rows.Count;
                            }
                            else
                            {
                                e.Cancel = false;
                                tabla.Rows[e.RowIndex].ErrorText = string.Empty;
                            }
                        }
                    }
                }
    
    

    martes, 29 de diciembre de 2015 19:18