Tengo un DataGridView que contiene columnas que tienen que ser ReadOnly. El problema es que el valor no se puede seleccionar ... Necesito hacer posible copiar y pegar solo con el mouse.

Además, DataGridView.SelectionMode tiene que ser DataGridViewSelectionMode.FullRowSelect o DataGridViewSelectionMode.RowHeaderSelect

¿Alguna idea de cómo resolver este problema?

Busqué algunas propiedades como Editable o algo así, pero solo encontré la propiedad ReadOnly.

EDITAR:

Solo necesito el valor de celda que está en la celda de solo lectura.

1
Bambuk 7 mar. 2017 a las 13:45

2 respuestas

La mejor respuesta

En este código, hice las columnas mediante programación y configuré la primera columna como de solo lectura. Con un modo de selección de CellSelect puede copiar los datos de solo lectura más fácilmente. Si usa FullRowSelect, siempre copia la fila completa (a menos que vaya al modo de edición y copie una celda editable).

dataGridView.Columns.Add( "column1Column", "T1" );
dataGridView.Columns[0].ReadOnly = true;
//The first column (T1) is now ReadOnly
dataGridView.Columns.Add("column2Column", "T2");
dataGridView.Columns.Add("column3Column", "T3");
dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
//Or use this if you want to copy cell content of readonly cells
dataGridView.SelectionMode = DataGridViewSelectionMode.CellSelect;

Una manera fácil (en mi experiencia, fácil de usar) de obtener datos de una celda de ReadOnly solo con un mouse es crear un controlador de eventos CellMouseClick.

Ejemplo

private void dataGridView_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
    {
        if ( e.Button == MouseButtons.Right )
        {
            //Set text to clipboard
            Clipboard.SetText( dataGridView[e.ColumnIndex, e.RowIndex].Value.ToString() );
        }
    }
1
EpicKip 7 mar. 2017 a las 11:09

Para obtener la celda en la que se hizo clic con DataGridViewSelectionMode.FullRowSelect:

DataGridViewCell clickedCell;

private void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
    try
    {
        if (e.Button == MouseButtons.Right)
        {
            dataGridView1.ClearSelection();
            clickedCell = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex];
            clickedCell.Selected = true;

            var cellRectangle = dataGridView1.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, true);
            // Show context menu with 'Copy' option
            contextMenuStrip1.Show(dataGridView1, cellRectangle.Left + e.X, cellRectangle.Top + e.Y);
        }

    }
    catch (Exception ex)
    {
        throw ex; 
    }
}

Luego agregue un contextMenuStrip al formulario y en el evento de clic en el elemento copy (el menú contextual se mostrará desde el evento anterior):

private void copyToolStripMenuItem_Click(object sender, EventArgs e)
{            
    Clipboard.SetText(clickedCell.Value.ToString());
}
0
dbardelas 7 mar. 2017 a las 12:14