Sie müssen DataGrid.AutoGenerateColumns
auf False
setzen, um zu verhindern, dass die Spalten automatisch generiert werden. Dann müssen Sie die von Ihnen definierten Spalten explizit binden. DataGridCheckBoxColumn
und DataGridTextColumn
haben beide andere Eigenschaften, die Sie ebenfalls einstellen können, um das, was Sie im Raster sehen, weiter anzupassen.
<DataGrid
Name="getEmployees"
AutoGenerateColumns="False"
>
<DataGrid.Columns>
<DataGridCheckBoxColumn
Binding="{Binding enabled}"
Header="Enabled"
/>
<DataGridTextColumn
Binding="{Binding proxyFor}"
Header="Proxy For"
/>
</DataGrid.Columns>
</DataGrid>
Wenn die Checkbox Spalte nicht so, wie Sie wollen nicht funktioniert, könnten Sie versuchen, eine value converter Schreiben zwischen Integer- und einem boolean zu konvertieren.
XAML (teilweise):
<DataGridCheckBoxColumn
xmlns:myconv="clr-namespace:MyProject.Converters"
Binding="{Binding enabled, Converter={myconv:IntToBool}}"
/>
C#
namespace MyProject.Converters
{
public class IntToBool : MarkupExtension, IValueConverter
{
public override object ProvideValue(IServiceProvider serviceProvider) => this;
public virtual object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return ((int)value) != 0;
}
public virtual object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return ((bool)value) ? 1 : 0;
}
}
}
Wenn das nicht funktioniert, werden Sie eine DataGridTemplateColumn
stattdessen verwenden müssen, die Sie viel mehr Macht geben Kontrollieren Sie, wie die Spalte aussieht und wie sie funktioniert.
Als Antwort auf Ihre erste Frage "Gibt es eine Möglichkeit, die SQL-Abfrage zu laden und direkt mit dem DataGrid zu verbinden?", Bin ich nicht sicher, was das genau bedeutet: Fragen Sie, ob Sie eine SQL zuweisen können String zu einer Eigenschaft von DataGrid
und lassen Sie die Abfrage ausführen und selbst ausfüllen? Nein. Sie könnten eine angehängte Eigenschaft schreiben, um das zu tun, wenn Sie wirklich wollen. Das könnte Spaß machen.
Ein weiterer Punkt, den Sie nicht zustande fragen, aber sollte erwähnt werden:
CmdString = "SELECT proxyFor, enabled FROM accesscontrol WHERE currentlyLoggedOnUser = '"
+ Environment.UserName + "'";
Wenn Sie bereits wissen, dass das eine schlechte Praxis und Sie planen, es zu ersetzen, sobald Sie den Code arbeiten zu bekommen, dann Sie brauchen nicht zu hören, aber in dem Fall, dass nicht so ist, sollten Sie wirklich eine absolute Gewohnheit, mit Parametern vornehmen:
CmdString = "SELECT proxyFor, enabled FROM accesscontrol WHERE "
+ "currentlyLoggedOnUser = @userName";
OleDbCommand cmd = new OleDbCommand(CmdString, con);
cmd.Parameters.AddWithValue("userName", Environment.UserName);
Was passiert, wenn somebody has a single quote in his user name? Es kann vorkommen. Und wenn Sie eine einfache Verkettung von SQL-Strings in externem Code verwenden, erlauben Sie jedem auf der Erde, willkürliches SQL in Ihrer Datenbank auszuführen.
Warum haben Sie ItemsSource="{Binding}"
im XAML? Dadurch wird der DataContext DataContext an ItemsSource gebunden.Wenn Ihre Ansicht ein View-Modell hat, sollte dieser DataContext das View-Modell sein; Sonst ist es wahrscheinlich null. Und Sie vergeben sowieso etwas anderes im Code dahinter.
Ich weiß nicht, warum ich es dort hatte. Jemand hat mir gesagt, ich soll es dort ablegen und die XAML enthalten ItemsSource = "{Binding Mode = TwoWay, Pfad = accesscontrol}" –
@softwareisfun Nun, normalerweise würden Sie die Abfrage Ergebnisse in eine 'ObservableCollection' auf Ihrem View-Modell setzen und Sie würden Binden Sie es wie folgt: 'ItemsSource =" {Binding WhateverIcalledMyResultsCollection} "'. Und das ist zu empfehlen, aber ich dachte, wir müssten nicht dorthin gehen, bis das Raster funktioniert. –
Wie würden wir den Datensatz aktualisieren, wenn wir den Status des Kontrollkästchens von Aktiviert auf Deaktiviert ändern möchten? –