WPF Datagrid 更新单元格值按钮单击

WPF Datagrid Update Cell Value Button Click

我有一个数据网格,我在其中添加了两个按钮列。一个加号和减号按钮,如果你愿意的话。我想要做的是当用户单击加号按钮时,另一列的值增加一个。相反,单击减号按钮减一 - 如果大于 0。到目前为止,它是这样的:

http://imgur.com/6WiayIW

我希望这个数字出现在 'Standard Packs Needed' 列中。我对 WPF 比较陌生,所以大多数此类内容都令人困惑。不管怎样,这是我的代码:

 <DataGrid x:Name="dataGrid" FontSize="15" CanUserAddRows="false" Margin="10,113,10,10" ColumnWidth="*" RowHeight="45" ItemsSource="{Binding Items, Mode=OneWay}" AutoGenerateColumns="False" IsReadOnly="True" AlternatingRowBackground="#FF6E6E6E" Foreground="Black" BorderBrush="#FF595A5B" Background="Transparent" HorizontalGridLinesBrush="Black" VerticalGridLinesBrush="Black" CanUserReorderColumns="False" RowHeaderWidth="0" >

        <DataGrid.RowStyle>
            <Style TargetType="DataGridRow">
                <Setter Property="Background" Value="#FF575757" />
                <Setter Property="Foreground" Value="White" />

                <Style.Triggers>

                </Style.Triggers>
            </Style>
        </DataGrid.RowStyle>
        <DataGrid.Resources>
            <Style TargetType="{x:Type DataGridColumnHeader}">
                <Setter Property="Background" Value="#FF616161" />
                <Setter Property="Foreground" Value="White" />
                <Setter Property="FontSize" Value="14"/>
            </Style>
            <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="DodgerBlue"/>
            <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightTextBrushKey}" Color="White"/>
        </DataGrid.Resources>
        <DataGrid.Columns>
            <DataGridTextColumn Header="Order Number" Binding="{Binding compOrderNumber}"></DataGridTextColumn>
            <DataGridTextColumn Header="Start Date" Binding="{Binding tstart, StringFormat=\{0:yyyy-MM-dd \}}" ></DataGridTextColumn>
            <DataGridTextColumn x:Name="dataGridTextColumn" Header="Tool" Binding="{Binding tool}"></DataGridTextColumn>
            <DataGridTextColumn Header="Parent Tool" Binding="{Binding parentTool}" Visibility="Hidden"></DataGridTextColumn>
            <DataGridTextColumn Header="Component" Binding="{Binding component}"></DataGridTextColumn>
            <DataGridTextColumn Header="Color No." Binding="{Binding colorno}" Visibility="Hidden"></DataGridTextColumn>
            <DataGridTextColumn Header="Material No." Binding="{Binding matno}" Visibility="Hidden"></DataGridTextColumn>
            <DataGridTextColumn Header="Quantity" Binding="{Binding qty}" Visibility="Hidden"></DataGridTextColumn>
            <DataGridTextColumn Header="Seq." Visibility="Hidden" Binding="{Binding seq}"></DataGridTextColumn>
            <DataGridTextColumn Header="Press" Binding="{Binding press}" Visibility="Hidden"></DataGridTextColumn>
            <DataGridTextColumn Header="LDR" Binding="{Binding LDR}" Visibility="Hidden"></DataGridTextColumn>
            <DataGridTextColumn Header="Remaining" Visibility="hidden" Binding="{Binding remaining, StringFormat={}{0:n0}}"></DataGridTextColumn>
            <DataGridTextColumn Header="Weight"  Binding="{Binding TotalWeight, StringFormat={}{0:n0}}" Visibility="Hidden"></DataGridTextColumn>
            <DataGridTemplateColumn Header="" >
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>

                            <Button x:Name="myButton4" Background="Red" HorizontalContentAlignment="Center" Content="-" Foreground="White" Click="myButton4_Click"></Button>

                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTemplateColumn Header="" >
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>

                            <Button x:Name="myButton4" Background="Green" HorizontalContentAlignment="Center" Content="+" Foreground="White" Click="myButton4_Click"></Button>

                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTextColumn Header="Standard Pack"  Binding="{Binding stdPack}"></DataGridTextColumn>
            <DataGridTextColumn Header="Standard Packs Needed" IsReadOnly="False" Binding="{Binding needed}"></DataGridTextColumn>
        </DataGrid.Columns>
        <DataGrid.CellStyle>
            <Style TargetType="DataGridCell">
                <Setter Property="Padding" Value="-5"/>

                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type DataGridCell}">
                            <Border Padding="{TemplateBinding Padding}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
                                <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                            </Border>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </DataGrid.CellStyle>
    </DataGrid>

还有我的代码:

Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
    Dim CmdString As String = String.Empty
    Using con As New SqlConnection("Data Source=10.0.0.54;Initial Catalog=Crib3LV;User ID=sa;Password=Jacob123!;Connect Timeout=200; pooling=true; Max Pool Size=200;")
        CmdString = " SELECT *, '1000' as [stdPack], '0' as needed FROM tblCurrentComponent WHERE press = 'D-PLR LH' AND printed = '1' "
        'CmdString = "SELECT DISTINCT orderNumber,  tstart, tool, colorno, matno, qty FROM tblSchedule WHERE press = '" & dataClass.press & "' ORDER BY tstart;"
        Dim cmd As New SqlCommand(CmdString, con)
        Dim sda As New SqlDataAdapter(cmd)
        Dim dt As New DataTable("Orders")
        sda.Fill(dt)
        dataGrid.ItemsSource = dt.DefaultView
    End Using
    dataGrid.SelectedItem = Nothing


    dataGrid.Columns(9).Visibility = Windows.Visibility.Hidden
    dataGrid.UnselectAll()


End Sub

Private Sub myButton4_Click(sender As Object, e As RoutedEventArgs)
    'MsgBox("i fired")
    For Each rowView As DataRowView In dataGrid.SelectedItems
        If rowView IsNot Nothing Then
            Dim row As DataRow = rowView.Row
            gridind = dataGrid.SelectedIndex

            MsgBox(gridind & " " & row.ItemArray(4).ToString)
            dataGrid.Columns(4).IsReadOnly = False
            Dim row2 As DataRowView = DirectCast(Content.DataContext, DataRowView)

        End If
    Next

End Sub

正如您在按钮点击中看到的,我知道如何获取一些值,但我不知道如何设置它们。之后我打算做的只是遍历所有行并将它们插入到 SQL table 中。到时候我可能会回到这里。无论如何,感谢您能给我的任何帮助,并提前感谢您的耐心等待。

要做的第一件事是将您的 DataTable 设为私有字段,使您的点击处理程序可以访问它:

 Private myDataTable As DataTable

然后你可以用myDataTable = New DataTable("Orders")

替换你的Dim dt As New DataTable("Orders")

您为两个按钮指定了相同的名称,因此我建议您修复该问题并将点击处理程序重命名为更有意义的名称,然后执行以下操作:

Private Sub AddButton_Click(sender As Object, e As RoutedEventArgs)
    If dataGrid.SelectedIndex >= 0 Then
        Dim currentCount As Integer = CInt(myDataTable.Rows(dataGrid.SelectedIndex)("needed"))
        myDataTable.Rows(dataGrid.SelectedIndex)("needed") = currentCount + 1
    End If
End Sub

然后类似的减法:

Private Sub SubtractButton_Click(sender As Object, e As RoutedEventArgs)
    If dataGrid.SelectedIndex >= 0 Then
        Dim currentCount As Integer = CInt(myDataTable.Rows(dataGrid.SelectedIndex)("needed"))
        If currentCount > 0 Then
            myDataTable.Rows(dataGrid.SelectedIndex)("needed") = currentCount - 1
        End If
    End If
End Sub

由于您的 DataGrid 绑定到您的 DataTable,您对基础 table 所做的任何更改都将更新网格。