Ik wil mijn DataGridView
alleen 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 DataGridView
onselecteerbaar 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 = true
op 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%
Enabled
eigenschap 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 Enabled
in 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
, ReadOnly
op true
, RowHeadersVisible
naar false
, ScollBars
naar None
en vervolgens het voorkomen van selectie fakenwerkte voor mij het beste. Als u Enabled
niet 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.ReadOnly
eigendom
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;