2016-04-25 8 views
0
<DataGrid Name="employeesDataGrid" AutoGenerateColumns="False"> 
     <DataGrid.Columns> 
      <DataGridCheckBoxColumn 
       xmlns:myconv="clr-namespace:MyProject.Converters" 
       Binding="{Binding enabled, Converter={myconv:IntToBool}}" 
       Header="Enabled"> 
       <DataGridCheckBoxColumn.CellStyle> 
        <Style> 
         <EventSetter Event="CheckBox.Checked" Handler="OnChecked" /> 
        </Style> 
       </DataGridCheckBoxColumn.CellStyle> 
      </DataGridCheckBoxColumn> 
      <DataGridTextColumn 
       Binding="{Binding proxyFor}" 
       Header="Proxy For" 
       /> 
     </DataGrid.Columns> 
    </DataGrid> 

Code hinterWie erkennen Sie, ob eine Checkbox ein- und ausgeschaltet ist und diese Änderungen in die Datenquelle zurückschreibt?

private void OnChecked(Object sender, RoutedEventArgs e) 
    { 
     // Not sure what to do here. 
    } 

Wie kann ich verfolgen, was in der Datentabelle oder der ausgewählten Zeile geändert?

ich geladen bin dies auf Initialize() mit dem folgenden Code

 using (OleDbConnection con = new OleDbConnection(connectionString)) 
     { 
      dt = new DataTable("accesscontrol"); 

      CmdString = "SELECT proxyFor, enabled FROM accesscontrol WHERE currentlyLoggedOnUser = @userName"; 
      OleDbCommand cmd = new OleDbCommand(CmdString, con); 
      cmd.Parameters.AddWithValue("userName", Environment.UserName); 
      using (adapter = new OleDbDataAdapter(cmd)) 
      { 
       adapter.Fill(dt); 
      }      
      employeesDataGrid.ItemsSource = dt.DefaultView; 
+0

Wie Sie Ihre Daten für die Datentabelle erzeugen, wird jede Zeile ein Viewmodel oder Modell entsprechen? –

+0

Frage aktualisiert mit der Art, wie die Daten geladen werden –

Antwort

2

Dies ist, was ich tun würde; Ich würde einen Zwischenschritt zwischen dem Laden der Daten hinzufügen. Ich würde die Daten, die Sie geladen haben, in ein Model übertragen, das die Eigenschaften haben würde, die den benötigten Typen entsprechen, und die Bindung an die Modelle vornehmen würde. Alle Änderungen, die vorgenommen werden, bleiben in den von Ihnen erstellten Modellen erhalten.

Dies wird Ihnen einige bedeutende Vorteile geben, in der Tatsache, dass Sie die einzelnen Änderungen nicht im Auge behalten und sie auf diese Weise organisieren müssen. Auf diese Weise können Sie die Benutzeroberflächeninteraktion auch "sauberer" halten. Machen Sie den Code lesbarer und prägnanter.

Wenn Sie einen MSSQL-Server ausführen, sollten Sie sich Entity Framework ansehen. Es würde diese Arbeit viel einfacher machen.

Dies wird grob sein, wie Sie Ihre Modelle übersetzen der Basis aus OleDBConnection documentation

//this list should be declared out of this scope and be declared in the main class 
List<YourDbModel> models = new List<YourDbModel>(); 
using (OleDbConnection connection = new OleDbConnection(connectionString)) 
{ 
    OleDbCommand command = new OleDbCommand(queryString, connection); 
    connection.Open(); 
    OleDbDataReader reader = command.ExecuteReader(); 
    while (reader.Read()) 
    { 
     // translate the properties of your query to your model. 
     YourDbModel model = new YourDBModel(); 
     model.property = reader[0].ToString(); 
     models.add(model); 
    } 
    reader.Close(); 
} 

Sie dann benötigen ItemSource für die Datentabelle zu setzen. Momentan machst du das manuell. Ich bevorzuge den MVVM-Stil, aber aus Gründen der Konsistenz werde ich es auf deine Art tun.

Initilize(); 
employeesDataGrid.ItemSource = models; 

Jetzt müssen Sie Ihre Spalten neu konfigurieren, damit sie mit den neu erstellten Modellen übereinstimmen. Nachdem Sie Ihre Bindung festgelegt haben, die von den Spalten zu den Eigenschaften jedes einzelnen Modells wechselt, spiegeln sich die Änderungen automatisch von Ihren Modellen wider. Wenn Sie die Änderungen von Ihrem Modell auf Ihre Ansicht übertragen möchten, benötigen Sie ein geeignetes Ansichtsmodell.

Ich möchte Sie auch auffordern, die MVVM-Art der Bindung zu untersuchen, dies macht WPF wesentlich einfacher und macht mehr Spaß mit der Arbeit.

+1

Um zu erweitern, was Matt sagte, habe ich eine kleine Anwendung erstellt, um dies zu demonstrieren. Ich habe den Code in Gist eingefügt. Ich habe auch das Nuget-Paket Prim6 & Prism6 WPF für die Verwendung von DelegateCommands verwendet. Werfen Sie einen Blick hier - https://gist.github.com/TravisBoatman/d8d6293278ff77374400b391e4f6bece –

+0

Es muss Microsoft Access sein. SQL Server wäre besser, aber sie werden nie dafür bezahlen. Sie haben bereits die Verwendung von SQL Server Express verweigert. –

+0

@MattWilkinson Sie schlagen vor, eine andere Datei zu erstellen, die mein Datenmodell ist? aber du erklärst nicht, wie alles wieder zusammengeklebt wird. Ich bin ziemlich neu bei WPF und ich habe kein Problem damit, zu Ihrer Idee zu wechseln, wenn Sie teilen könnten, wie die Commits mit der Datenbank gemacht werden. –

-1

Sie müssen nicht feststellen, ob Ihre CheckBox an eine Boolesche Eigenschaft Ihrer DataSource gebunden ist. Die Eigenschaft wird automatisch aktualisiert.

+0

Es wurde nicht die Datenbank aktualisiert. Deshalb habe ich diese Frage gestellt –

2

Der richtige Weg, dies zu umgehen, wäre die Verwendung von Datenbindung.

  1. Ihre Datenmodelle erstellen (Sie sollten eine Boolesche Eigenschaft haben, dass Sie Ihre Kontrollkästchen binden kann)
  2. Put die Datenmodelle in einer beobachtbaren Sammlung
  3. Bind Ihre Datenraster auf Ihre beobachtbaren Sammlung

Wenn das Kontrollkästchen aktiviert oder deaktiviert ist, wird der Setter im Modell ausgelöst. Dies kann dann verwendet werden, um Operationen auszuführen, die Sie möchten.

Ich könnte Ihnen ein genaues Beispiel dafür geben, aber es gibt vielleicht eine Milliarde von ihnen bereits existiert. Um weitere Wiederholungen im Internet zu vermeiden, hier ein paar Links ...

What Is DataBinding

Datagrid binding in WPF

WPF checkbox binding

+0

Sobald Sie eine ObservableCollection haben, wie drücken Sie die Änderungen zurück in die Datenbank? –

+0

@softwareisfun Auf die gleiche Weise haben Sie die Daten aus der Datenbank, nur in umgekehrter Reihenfolge –

+0

http://www.w3schools.com/SQl/sql_update.asp –