2017-10-23 2 views
0

ich sendet habe auf SO eine Menge Antworten zu lesen, und ich konnte nicht einfach zu lösen mein Problem finden. Ich habe ein einfaches Datagrid und ich habe eine Checkbox-Spalte hinzugefügt.Datagrid Checkbox Spalte, die Update mysql Befehl

Mein Ziel ist es, einen Update-Befehl jedes Mal zu senden, wenn eine Zeile als geprüft geprüft wird. Irgendwo entlang der Linien von:

MySqlCommand cmd = new MySqlCommand("update MyTable set Location='" + Location + "',Date='" + Date + "',RegularPaidHours='" + RegularPaidHours + "', Audited '"yes" where ID = txt.id' , connection); 

Also, wenn jemand eine Zeilen überprüft, wird diese Zeile in der Datenbank aktualisiert. Wenn es nicht einfach null ist. Kann mir bitte jemand helfen? Ich weiß nicht wirklich, was meine beste Option ist.

Antwort

1

Binden Sie die Spalte mit einer Quelle Eigenschaft Ihrer Klasse entspricht, wo die Location, Date und RegularPaidHours Eigenschaft bereits definiert sind:

<DataGridCheckBoxColumn Header="Audited" Binding="{Binding IsAudited, UpdateSourceTrigger=PropertyChanged}" /> 

... und tun, was Sie in der Setter der Immobilie wollen:

private bool _isAuditing; 
public bool IsAuditing 
{ 
    get { return _isAuditing; } 
    set 
    { 
     _isAuditing = value; 
     //invoke a command or call a method that updates the DB from here... 
     Task.Run(() => { UpdateDb(Location, ...) }); 
    } 
} 

kann den Update-Befehl SQL im Code hinter schicken? Ich versuche es nur mit Code-Behind zu machen.

Dann sollten Sie die DataGridCheckBoxColumn mit einem DataGridTemplateColumn ersetzen und dem Checked und Unchecked Ereignis für die CheckBox in der Vorlage umgehen:

<DataGridTemplateColumn Header="Audited" > 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <CheckBox Checked="DataGridCheckBoxColumn_Checked" Unchecked="DataGridCheckBoxColumn_Unchecked" 
             IsChecked="{Binding IsAudited, UpdateSourceTrigger=PropertyChanged}"/> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
    <DataGridTemplateColumn.CellEditingTemplate> 
     <DataTemplate> 
      <CheckBox Checked="DataGridCheckBoxColumn_Checked" Unchecked="DataGridCheckBoxColumn_Unchecked" 
             IsChecked="{Binding IsAudited, UpdateSourceTrigger=PropertyChanged}"/> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellEditingTemplate> 
</DataGridTemplateColumn> 

private void DataGridCheckBoxColumn_Checked(object sender, RoutedEventArgs e) 
{ 
    CheckBox checkBox = sender as CheckBox; 
    var model = checkBox.DataContext as YourClass; 

    //update the DB using the properties of your model... 

} 
+0

Ich verwende MVVM oder EF für dieses Projekt nicht. Kann den Update-Befehl mit sql im Code hinter senden? Muss ich INotifyPropertyChanged implementieren? Ich versuche es nur mit Code-Behind zu machen. – iCosmin

+1

Es spielt keine Rolle, ob Sie MVVM verwenden. Du könntest immer noch tun, was du willst im Setter. Aber bitte beziehe mich auf meine Bearbeitung. – mm8

+0

Genau das habe ich gesucht! Vielen Dank für Ihre klare Erklärung. Ich bin dankbar für deine Hilfe! Worauf sollte sich "YourClass" beziehen? (checkBox.DataContext als YourClass;) Können Sie bitte einen Vorschlag machen? – iCosmin

1
<DataGrid AutoGenerateColumns="False" VirtualizingPanel.IsVirtualizingWhenGrouping="True" EnableColumnVirtualization="True" EnableRowVirtualization="True" VirtualizingPanel.IsVirtualizing="true" ColumnHeaderStyle="{StaticResource lowCase}" x:Name="dtGrid" HorizontalAlignment="Left" CanUserResizeRows="False" ItemsSource="{Binding}" GridLinesVisibility="All" HorizontalContentAlignment="Stretch" CanUserAddRows="false" VerticalAlignment="Top"> 
    <DataGrid.Columns> 
     <DataGridTemplateColumn Header="Audited"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <CheckBox Command="{Here your command. Most Probably Relative Source Binding}" CommandParameter="{Binding}"></CheckBox> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
     <DataGridTextColumn Binding="{Binding Location}" Header="Location" Visibility="Collapsed"/> 
     <DataGridTextColumn Binding="{Binding Date, StringFormat=MM-dd-yy}" Header="Date"/> 
     <DataGridTextColumn Binding="{Binding RegularPaidHours}" Header="Regular Repair Hours"/> 
    </DataGrid.Columns> 
</DataGrid> 

Und definieren RelayCommand mit der richtigen Parameter in Ansicht Modell

+0

ich keine Ansicht Modell verwenden. Wie kann ich das mit Code-Behind machen? Vielen Dank. – iCosmin

+1

Verwenden MVVM seine einfache wird Sie vor zukünftigen Problemen zu speichern? Für Code dahinter können Sie direkt mit DataGridRow arbeiten Selected-Ereignis – Ramankingdom

Verwandte Themen