鼠标滚轮在DataGrid中勾选和取消勾选复选框的检查

5
private void OnChecked(object sender, RoutedEventArgs e)
{
    try
    {
        LAB_TEST t = new LAB_TEST();
        CheckBox chk = (CheckBox)e.OriginalSource;
        if (e.OriginalSource is CheckBox)
        {
            int OID = Convert.ToInt32(((CheckBox)chk).Tag);
            t = eb.TestGetByOID(OID);
            bool has = advisedTests.Any(test => test.OID == OID);
            if (!has)
            {
                if (txtGrossAmount.Text != string.Empty)
                {
                    decimal amount = Convert.ToDecimal(txtGrossAmount.Text);
                    amount += Convert.ToDecimal(t.PRICE);
                    txtGrossAmount.Text = amount.ToString();
                }
                else
                {
                    txtGrossAmount.Text = t.PRICE.ToString();
                }
                advisedTests.Add(t);
            }
        }
    }
    catch (Exception ex)
    {

    }
}

我遇到了一个问题,我在Datagrid中绑定了复选框,并在我们点击复选框时进行一些简单的数学计算,它应该将总和添加到文本框中,它确实这样做了,但问题是鼠标向上或向下滚动会自动勾选或取消勾选复选框,现在文本框中选择项目的总价格比选择的复选框少或多,有时更多,所以鼠标向上或向下滚动会导致此问题。有什么想法吗?谢谢。

2
请提供一个代码示例来说明您的问题,并考虑在描述中澄清场景和问题。 - Samuel Slade
我同意,你的问题没有清晰地陈述。 - Josh
3个回答

5
您需要在Grid中设置VirtualizingStackPanel.IsVirtualizing="False"

最适合我的解决方案 - 在DataGrid中设置 VirtualizingPanel.IsVirtualizing="False" 后它可以正常工作。 - Bassie
1
谢谢Bassie!!! 在你的答案之前,我已经搜寻了2个小时。我使用的是ListView而不是DataGrid,但设置ScrollViewer.CanContentScroll = False就解决了问题。在网格中设置VirtualizingStackPanel.IsVirtualizing="False"对我无济于事。 @Bassie - Kevin Moore

2

我有完全相同的问题,场景如下:

  • 您有一个数据网格,每行包含一个复选框
  • 复选框已设置其选中/取消选中事件:如果选择是多个,则切换所有复选框
  • 选择多行
  • 检查一个复选框,整个选择都被检查
  • 保留选定行,并滚动使它们不可见
  • 一旦它们从UI中消失,所选行的复选框应该被选中/取消选中

Jacek提供的解决方案有效,但内容不再支持使用鼠标滚轮滚动,必须将鼠标光标置于滚动条上。

在我的项目中似乎有效的解决方法是向DataGrid添加此属性

ScrollViewer.CanContentScroll="False" 

这很奇怪,因为它告诉Datagrid不要滚动,但是,内容仍然可以通过鼠标滚轮滚动,并且复选框状态的切换问题不再发生。


几年后我又面临了这个问题,实际上正确的答案是由thinco(在下面的帖子中IsVirtualizing为False)给出的! - MrPingouin

0

我在Silverlight中遇到了同样的问题。当你滚动时,DataGrid会触发RowLoading事件,并重新初始化复选框。我只找到一种解决方法,不要使用内置的垂直滚动条DataGrid,而是将DataGrid的高度设置为自动,并将其放置在ScrollViewer中。

<ScrollViewer VerticalScrollBarVisibility="Visible">
   <DataGrid Height="Auto" />
</ScrollViewer>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接