Tengo un Sistema.Windows.Formas DataGridView enlazado a un List<MyObject>.

La clase MyObject contiene una propiedad booleana que está obligado a DataGridViewCheckboxCell en el DataGridView.

public class MyObject
{
    public decimal DefaultValue {get; set; }
    public bool HasCustomValue {get;set; }
    public decimal CustomValue {get;set; }
    public decimal CurrentValue
    {
        get
        {
            return HasCustomValue
                ? CustomValue
                : DefaultValue;
        }
}

Si puedo cambiar el valor de HasCustomValue otro (readonly) propiedad CurrentValue cambios en su valor, también.
Que se realiza mediante la aplicación de la INotifyPropertyChanged el evento (a la izquierda que parte de la fuente de ejemplo para simplificar)

Si he cambiado HasCustomValue desde fuera del DataGridView, la columna enlazada a CurrentValue se actualiza inmediatamente.
Howevery, Si el usuario activa/desactiva la casilla de verificación, HasCustomValue no es cambiado en el origen de datos subyacente a menos que él sale de la columna haciendo clic con el ratón o pulsando la tecla TAB.

Es allí una manera de forzar a la red para actualizar el origen de datos directamente después de cambiar una casilla de verificación valor?

Si puedo enlazar un Control de la Propiedad de tener la capacidad de establecer la DataSourceUpdateMode a Windows.Forms.DataSourceUpdateMode.OnPropertyChanged pero no he encontrado nada parecido en un DataGridView

  • Puedes mostrar el DataGridView marcado?
  • Es WinForms, así que no tengo código de marcado 😉
  • Yo en serio que no se puede pensar de cualquier elemento en C# que no tiene código o lenguaje de marcado. Puede ser un diseñador visual, pero todavía hay código. Está usted seguro de que no hay ningún código de marcado?
  • Yo no llamaría el diseñador de código de código de marcado en.wikipedia.org/wiki/Markup_language de todos Modos, yo no he establecido ninguna de las propiedades particulares, acaba de agregar una Casilla de verificación de la columna del DataGridView y algunos textbox columnas, también. Supongo que voy a seguir alliswell la sugerencia y controlar el evento Click.

5 Comentarios

  1. 2

    Supongo que usted está usando bindingsource, a continuación, en la Casilla de Verificación haga Clic en evento/Editado hacer el ,

        BindingSource.EndEdit()
  2. 2

    He tenido un problema similar. Y yo no estaba usando un BindingSource, sólo un BindingList. Después de un montón de frustración y de la experimentación (y siguientes soluciones diferentes que no acababa de trabajo),

    Yo simplemente hice esto:

    • reemplazar el DataGridView‘s CellMouseUp evento
    • en el evento, llame a la DataGridView‘s EndEdit() método.
  3. 1

    Hice este truco:

    • Conjunto de la columna con la Casilla de verificación sólo lectura de la propiedad a true.
    • A continuación, en CellContentClick controlador de eventos de cambiar mediante programación el valor a su valor opuesto.

      private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
      {
          int chkBoxColIdx = 0; //Index of the column with checkbox.
          if (e.ColumnIndex == chkBoxColIdx)
          {
              dataGridView1.Rows[e.RowIndex].Cells[chkBoxColIdx].Value = !(bool)dataGridView1.Rows[e.RowIndex].Cells[chkBoxColIdx].Value;
          }
    • Ajuste de la columna de la propiedad de sólo lectura que funcionó para mí, demasiado, con código de puesto en el evento OnClick. El uso de la InvalidateCell método en el DataGridView, a continuación, establezca el valor de la celda,
  4. 1

    Uso de controlador para datagridview.CurrentCellDirtyStateChanged

    private void datagridview_CurrentCellDirtyStateChanged(Object sender, EventArgs e)
    {
        //_checkboxColumnIndex - index of your checkboxcolumn
        DataGridView dgv = (DataGridView)sender;
        if (_checkboxColumnIndex == dgv.CurrentCell.ColumnIndex &&
            dgv.Columns[_checkboxColumnIndex].GetType() == typeof(DataGridViewCheckBoxColumn) &&
            dgv.IsCurrentCellDirty == true)
        {          
            //Remember that here dgv.CurrentCell.Value is previous/old value yet
            YourObject.HasCustomValue = !(bool)dgv.CurrentCell.Value
        }
    
        dgv.CommitEdit(DataGridViewDataErrorContexts.Commit) //this will fire .CellEndEdit event
    }
    • Esto funciona para mí, aunque la EventArgs objeto no tiene un e.ColumnIndex. Usted puede utilizar dgv.CurrentCell.ColumnIndex en lugar de e.ColumnIndex.
    • Sí, tienes razón. He actualizado mi respuesta. Gracias
  5. 1

    Me imagino que usted no desea que su bindingSource saber a lo que se enlaza. Después de todo, no es por eso que se creó un bindingSource: ser capaz de dejarlo estar obligado a obligado a prácticamente cualquier cosa.

    Así que, naturalmente, usted no quiere saber cómo el valor de su elemento actual es cambiado; sólo desea saber que ha sido cambiado.

    Para ello, se utiliza evento BindingSource.CurrentItemChanged: cualquiera sea el método que se utiliza para cambiar los datos, se le notificará.

    El punto de vista de que está enlazado el BindingSource tiene que decir el BindingSource que al cambiar el valor está terminado; la edición de la propiedad ha terminado.

    En su caso, la opinión es un DataGridView. Un DataGridView dice el BindingSource que la celda actual ha terminado de cambiar el uso de DataGridView.EndEdit().

    Con normalidad, mientras que usted está escribiendo la célula, la edición se terminó cuando la célula pierde el foco, o cuando se presiona la tecla esc. Esto le da la oportunidad de corregir los errores de escritura o cancelar la edición en caso de que no desee que los cambios.

    Sin embargo, en el caso de un DataGridViewCheckBoxCell la mayoría de la gente espera a terminar de editar tan pronto como el DataGridviewCheckBoxCell se hace clic.

    Por lo tanto, usted necesita para manejar evento DataGridView.CurrentCellDirtyStateChanged

    //Whenever a DataGridViewCheckBoxCell becomes dirty editing is finished:
    private void OnCurrentCellDirtyChanged(object sender, EventArgs e)
    {
        if (this.dataGridView1.CurrentCell is DataGridViewCheckBoxCell;
        {
            this.dataGridView1.EndEdit();
        }
    }

    Esto llevará a un evento BindingSource.CurrentItemChanged

Dejar respuesta

Please enter your comment!
Please enter your name here