問題
WPF 資料網格。一個表三列的資料集。價格、折扣、總計。唯一可編輯的列是折扣。如果我在網格完全可見的情況下輸入資料,則一切正常。

但是如果我縮小視窗并輸入資料,它們就會混淆。它只是弄亂了我在編輯當前單元格結束時看不到的值。似乎是出于惡意!

當我通過放大視窗查看整個網格時的結果是這樣的:

正如你所看到的,總數是混合的!
編碼
我重新創建了一個您可以自己測驗的最小示例。
XAML
<Window x:Class="DataGrid"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:TestDatagrid"
mc:Ignorable="d"
Title="DataGrid" Height="450" Width="800" Loaded="Window_Loaded">
<Grid>
<DataGrid x:Name="grid" Margin="0,28,0,38"
CanUserDeleteRows="True"
CanUserSortColumns="True"
CanUserAddRows="False"
SelectionUnit="CellOrRowHeader"
CellEditEnding="grid_CellEditEnding"/>
</Grid>
</Window>
VB.NET
Imports System.Data
Imports System.Globalization
Public Class DataGrid
Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs)
Dim ds As New DataSet
Dim tb As New DataTable("Orders")
Dim price As New DataColumn
price.ColumnName = "Price"
price.DataType = System.Type.GetType("System.Decimal")
tb.Columns.Add(price)
Dim discount As New DataColumn
discount.ColumnName = "Discount"
discount.DataType = System.Type.GetType("System.Decimal")
tb.Columns.Add(discount)
Dim total As New DataColumn
total.ColumnName = "Total"
total.DataType = System.Type.GetType("System.Decimal")
tb.Columns.Add(total)
For i As Integer = 0 To 20
Dim dr As DataRow = tb.NewRow()
dr("Price") = CDec((i 1) * 10)
dr("Discount") = 0
dr("Total") = CDec((i 1) * 10)
tb.Rows.Add(dr)
Next
ds.Tables.Add(tb)
grid.ItemsSource = ds.Tables(0).DefaultView
For Each c In grid.Columns
If c.Header = "Price" Then c.IsReadOnly = True
If c.Header = "Total" Then c.IsReadOnly = True
Next
End Sub
Private Sub grid_CellEditEnding(sender As Object, e As DataGridCellEditEndingEventArgs)
If e.EditAction = DataGridEditAction.Commit Then
Dim nfi As NumberFormatInfo = New NumberFormatInfo()
nfi.NumberDecimalSeparator = "."
Try
Dim tPrice As TextBlock = TryCast(grid.Columns(0).GetCellContent(e.Row), TextBlock)
Dim Price As Double = CDbl("0" & Replace(tPrice.Text, ".", ","))
Dim Discount As Double = CDbl("0" & Replace(TryCast(e.EditingElement, TextBox).Text, ".", ","))
Dim Total As Double = Price * (1 - (Discount / 100))
' Format the discount value
e.EditingElement.SetValue(TextBox.TextProperty, String.Format(nfi, "{0:0.00#}", Discount))
' Format and show the value on datagrid
TryCast(grid.Columns(2).GetCellContent(e.Row), TextBlock).Text = String.Format(nfi, "{0:0.00#}", Total)
' Update the value on grid
TryCast(grid.CurrentItem, DataRowView).Item(2) = Total
Catch ex As Exception
End Try
End If
End Sub
End Class
我真的不知道發生了什么!
感謝您給我的任何提示或幫助。
uj5u.com熱心網友回復:
我真的不知道發生了什么!
虛擬化,即出于性能原因,您錯誤編輯的元素會被重新使用。
顯而易見且推薦的解決方案是避免直接編輯視覺元素,而是編輯底層的列DataRowView。
另一種解決方案是禁用虛擬化:
<DataGrid VirtualizingPanel.IsVirtualizing="False" EnableRowVirtualization="False" ... />
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/496845.html
