Hoe de mogelijkheid om te selecteren in een DataGridView uitschakelen?

Ik wil mijn DataGridViewalleen gebruiken om dingen te tonen, en ik wil dat de gebruiker geen rij, veld of iets anders kan selecteren uit de DataGridView.

Hoe kan ik dit doen?


Antwoord 1, autoriteit 100%

Ik zou voor dit gaan:

private void myDataGridView_SelectionChanged(Object sender, EventArgs e)
{
    dgvSomeDataGridView.ClearSelection();  
}

Ik ben het niet eens met de algemene bewering dat geen enkele DataGridViewonselecteerbaar mag zijn. Sommige UI’s zijn gebouwd voor tools of touchscreens, en door een selectie toe te staan, wordt de gebruiker misleid om te denken dat selecteren ze daadwerkelijk ergens zal brengen.

Het instellen van ReadOnly = trueop het besturingselement heeft geen invloed op of een cel of rij kan worden geselecteerd. En er zijn visuele en functionele nadelen aan het instellen van Enabled = false.

Een andere optie is om de geselecteerde kleuren zo in te stellen dat ze precies zijn wat de niet-geselecteerde kleuren zijn, maar als je toevallig de achterkleur van de cel manipuleert, levert deze methode ook vervelende resultaten op.

>


Antwoord 2, autoriteit 14%

U kunt als volgt een transparante achtergrondkleur instellen voor de geselecteerde cellen:

DataGridView.RowsDefaultCellStyle.SelectionBackColor = System.Drawing.Color.Transparent;

Antwoord 3, autoriteit 9%

Enabledeigenschap om false

of

this.dataGridView1.DefaultCellStyle.SelectionBackColor = this.dataGridView1.DefaultCellStyle.BackColor;
this.dataGridView1.DefaultCellStyle.SelectionForeColor = this.dataGridView1.DefaultCellStyle.ForeColor;

Antwoord 4, autoriteit 2%

Ik heb dit opgelost door de eigenschap Enabledin te stellen op false.


Antwoord 5, autoriteit 2%

Als u de informatie in de geselecteerde cel niet hoeft te gebruiken, werkt het wissen van de selectie, maar als u toch de informatie in de geselecteerde cel moet gebruiken, kunt u dit doen om het te laten lijken dat er geen selectie is en de achtergrondkleur zal nog steeds zichtbaar zijn.

private void dataGridView_SelectionChanged(object sender, EventArgs e)
    {
        foreach (DataGridViewRow row in dataGridView.SelectedRows)
        {
            dataGridView.RowsDefaultCellStyle.SelectionBackColor = row.DefaultCellStyle.BackColor;
        }
    }

Antwoord 6

Dit werkte voor mij als een tierelier:

row.DataGridView.Enabled = false;
row.DefaultCellStyle.BackColor = Color.LightGray;
row.DefaultCellStyle.ForeColor = Color.DarkGray;

(waar rij = DataGridView.NewRow(passende overbelasting);)


Antwoord 7

Ik heb gevonden dat ik alle eigenschappen van AllowUser...instelde op false, ReadOnlyop true, RowHeadersVisiblenaar false, ScollBarsnaar Noneen vervolgens het voorkomen van selectie fakenwerkte voor mij het beste. Als u Enabledniet instelt op false, kan de gebruiker de gegevens nog steeds uit het raster kopiëren.

De volgende code ruimt ook het uiterlijk op als u een eenvoudig weergaveraster wilt (ervan uitgaande dat rijen dezelfde hoogte hebben):

int width = 0;
for (int i = 0; i < dataGridView1.Columns.Count; i++)
{
    width += dataGridView1.Columns[i].Width;
}
dataGridView1.Width = width;
dataGridView1.Height = dataGridView1.Rows[0].Height*(dataGridView1.Rows.Count+1);

Antwoord 8

Ik vond het antwoord van user4101525 het beste in theorie, maar het werkt niet echt.
Selectie is geen overlay, dus je ziet wat er onder controle is

Ramgy Borja’s antwoord gaat niet over het feit dat de standaardstijl eigenlijk helemaal geen kleur is, dus het toepassen ervan helpt niet.
Dit behandelt de standaardstijl en werkt als je je eigen kleuren toepast (wat edhubbell mogelijk nare resultaten noemt)

dgv.RowsDefaultCellStyle.SelectionBackColor = dgv.RowsDefaultCellStyle.BackColor.IsEmpty ? System.Drawing.Color.White : dgv.RowsDefaultCellStyle.BackColor;
dgv.RowsDefaultCellStyle.SelectionForeColor = dgv.RowsDefaultCellStyle.ForeColor.IsEmpty ? System.Drawing.Color.Black : dgv.RowsDefaultCellStyle.ForeColor;

Antwoord 9

u moet een aangepaste DataGridView maken

`

namespace System.Windows.Forms
{
    class MyDataGridView : DataGridView
    {
        public bool PreventUserClick = false;
        public MyDataGridView()
        {
        }
        protected override void OnMouseDown(MouseEventArgs e)
        {
            if (PreventUserClick) return;
            base.OnMouseDown(e);
        }
    }
}

`
merk op dat je het programma eerst een keer moet compileren met de toegevoegde klasse, voordat je het nieuwe besturingselement kunt gebruiken.

ga dan naar The .Designer.cs en verander de oude DataGridView in de nieuwe zonder je vorige code te verprutsen.

private System.Windows.Forms.DataGridView dgv; // found close to the bottom

private void InitializeComponent() {
    ...
    this.dgv = new System.Windows.Forms.DataGridView();
    ...
}

naar (respectievelijk)

private System.Windows.Forms.MyDataGridView dgv;
this.dgv = new System.Windows.Forms.MyDataGridView();

Antwoord 10

Het is in VB, maar zou niet moeilijk moeten zijn om naar C# te vertalen:
Als u datagridview wilt vergrendelen, gebruikt u dg.ReadOnly == True;

Als u wilt voorkomen dat de gebruiker een andere rij selecteert, onthoudt u gewoon de oude selectie en stelt u op basis van de wel of niet ingestelde voorwaarde de rij in die moet worden geselecteerd. Ervan uitgaande dat multiselectie is uitgeschakeld:

   Private Sub dg_SelectionChanged(sender As Object, e As EventArgs) Handles dg.SelectionChanged
    Static OldSelection As Integer
      If dg.Rows.Count > 0 Then
          If dg.SelectedRows(0).Index <> OldSelection And YOURCONDITION Then
            dg.Rows(OldSelection).Selected = True
          End If
        OldSelection = dg.SelectedRows(0).Index
      End If
    End Sub

Antwoord 11

Dit is wat altijd voor mij heeft gewerkt om de standaardselectie uit te schakelen in een klasse die is overgenomen van DataGridView:

// REQUIRES: SelectionMode = DataGridViewSelectionMode.FullRowSelect
protected override void SetSelectedRowCore(int rowIndex, bool selected)
{       
    base.SetSelectedRowCore(rowIndex, selected && ALLOW_DEFAULT_SELECTION);
}
bool ALLOW_DEFAULT_SELECTION = false;

Meestal is het doel om het volledig uit te schakelen (om ons eigen aangepaste selectie- en tekenproces te implementeren). Als het doel is om de standaardselectie alleen op specifieke tijden toe te staan, kan de boolean als volgt worden ingepakt:

public void SelectRowExplicitly(int index, bool selected = true)
{
    try
    {
        ALLOW_DEFAULT_SELECTION = true;
        Rows[index].Selected = selected;
    }
    finally
    {
        ALLOW_DEFAULT_SELECTION = false;
    }
}

Antwoord 12

Gebruik de DataGridView.ReadOnlyeigendom

De code in het MSDN-voorbeeldillustreert het gebruik van deze eigenschap in een DataGridView-besturingselement voornamelijk bedoeld voor weergave. In dit voorbeeld is de visuele weergave van het besturingselement op verschillende manieren aangepast en het besturingselement is geconfigureerd voor beperkte interactiviteit.

Let op deze instellingen in de voorbeeldcode:

// Set property values appropriate for read-only
// display and limited interactivity
dataGridView1.AllowUserToAddRows = false;
dataGridView1.AllowUserToDeleteRows = false;
dataGridView1.AllowUserToOrderColumns = true;
dataGridView1.ReadOnly = true;
dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridView1.MultiSelect = false;
dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;
dataGridView1.AllowUserToResizeColumns = false;
dataGridView1.ColumnHeadersHeightSizeMode = 
DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
dataGridView1.AllowUserToResizeRows = false;
dataGridView1.RowHeadersWidthSizeMode = 
DataGridViewRowHeadersWidthSizeMode.DisableResizing;

Other episodes