Столбец флажка Datagrid, который отправляет команду update mysql

Я читал много ответов о SO, и я не мог найти простого решения моей проблемы. У меня есть простая сетка данных, и я добавил столбец флажка.

<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>
        <DataGridCheckBoxColumn Header="Audited"></DataGridCheckBoxColumn>
        <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>

Моя цель - отправлять команду обновления каждый раз, когда строка проверяется как проверенная. Где-то вроде:

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

Поэтому, если кто-то проверяет строки, эта строка обновляется в базе данных. Если не просто иметь это значение null. Может кто-нибудь протянуть мне руку помощи с этим? Я действительно не знаю, какой у меня лучший вариант здесь.

# wpf datagrid
Источник
Codelisting
за 1 против
Лучший ответ

Привяжите столбец к исходному свойству вашего класса, гдеLocation ,Date а такжеRegularPaidHours свойство уже определены:

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

... и делайте все, что хотите в установщике свойства:

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, ...) });
    }
}

Can send the update command using sql in the code behind? I am looking to do it only with some code-behind.

Затем следует заменитьDataGridCheckBoxColumn сDataGridTemplateColumn и справиться сChecked а такжеUnchecked мероприятие дляCheckBox в шаблоне:

<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
    Я не использую MVVM или EF для этого проекта. Можно ли отправить команду обновления с помощью sql в коде позади? Мне нужно реализовать INotifyPropertyChanged? Я хочу сделать это только с некоторым кодом программной части.
  • 1
    Неважно, используете ли вы MVVM. Вы по-прежнему можете делать в сеттере все, что захотите. Но, пожалуйста, обратитесь к моему редактированию.
  • 0
    Это именно то, что я искал! Большое спасибо за четкое объяснение. Благодарю за помощь! К чему относится "YourClass"? (checkBox.DataContext как YourClass;) Не могли бы вы предложить предложение?
  • 1
    Это тип (класс) вашего объекта DataObject, в котором определены свойства Location, Date, ....
за 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>

И определите соответствующую RelayCommand с соответствующим параметром в модели просмотра

  • 0
    Я не использую модель просмотра. Как я могу сделать это с помощью кода программной части? Спасибо.
  • 1
    Использовать MVVM - это просто избавит вас от будущих проблем? Для кода позади вы можете напрямую работать с событием DataGridRow Selected
Codelisting
Популярные категории
На заметку программисту