鼠标滚动检查并取消选中DataGrid中的复选框

时间:2011-12-20 15:23:34

标签: c# wpf

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中绑定了复选框,当我们单击复选框时我会进行一些简单的数学计算它应该在文本框中添加总和而它正在这样做,但问题是鼠标上下滚动选中并取消选中复选框现在文本框中所选项目的总价格更高,选中的复选框更少或有时更多,因此鼠标向上或向下滚动创建此问题。任何的想法???? 谢谢

Issue Preview

3 个答案:

答案 0 :(得分:3)

我遇到了完全相同的问题,具体情况如下:

  • 您有一个DataGrid,每行包含一个复选框
  • 复选框设置了Checked / Unchecked事件:如果选择为多个,则会切换所有复选框
  • 选择多行
  • 选中一个复选框,选中整个选项
  • 保留选定的行,并滚动以使其不可见
  • 选择/取消选中选中的行复选框,只要它们从用户界面中消失

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

在我的项目中似乎有用的是将此属性添加到DataGrid

ScrollViewer.CanContentScroll="False" 

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

答案 1 :(得分:2)

您需要在网格中设置VirtualizingStackPanel.IsVirtualizing="False"

答案 2 :(得分:0)

我在Silverlight中遇到了同样的问题。滚动时,DataGrid会触发RowLoading事件,并重新初始化CheckBoxes。我发现只有一种方法可以解决它,不要使用内置的垂直滚动条DataGrid,将DataGrid的高度设置为auto并将其放在ScrollViewer中。

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