首页 新闻 会员 周边 捐助

wpf 多选框 使用滚动条造成选中和取消选中

0
悬赏园豆:10 [已解决问题] 解决于 2013-02-18 10:34

操作顺序:

1、手动选中 多选框,每列3个

2、滚动鼠标滚轮或下拉滚动条

3、返回查看之前选中的多选框。

问题的现象:

1、对于DataGridTemplateColumn 选中效果被丢失,剩余最后选中的行保持选中状态

2、对于DataGridCheckBoxColumn选中效果未丢失,滚动时有拖影效果

补充:

1、不使用DataGridCheckBoxColumn的原因是 DataGridCheckBoxColumn列需要单击2次才能选中

2、DataGridTemplateColumn 选中的行被隐藏会触发unchecked事件,造成选中的数据不被记录

3、如果考虑使用ScrollViewer如何保证列头不被看不到

对于DataGrid中以上2中checkbox的使用,不知是否有更优方案,希望得到各位高手的指点。

xaml代码:

<Grid Margin="0,0,45,17">
        <Grid.RowDefinitions>
            <RowDefinition Height="auto" ></RowDefinition>
        </Grid.RowDefinitions>
        <DataGrid Width="400" Height="400" AutoGenerateColumns="False" Name="dg" Grid.RowSpan="1" VerticalScrollBarVisibility="Auto" MouseWheel="dg_MouseWheel">
            <DataGrid.Columns>

                <DataGridCheckBoxColumn Binding="{Binding 1}" Width="auto" Header="DataGridCheckBoxColumn" >

                </DataGridCheckBoxColumn>

                <DataGridTemplateColumn Width="auto">
                    <DataGridTemplateColumn.HeaderTemplate>
                        <DataTemplate>
                            <TextBlock>DataGridTemplateColumn</TextBlock>
                        </DataTemplate>
                    </DataGridTemplateColumn.HeaderTemplate>

                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <CheckBox IsChecked="{Binding 2}" Unchecked="CheckBox_Unchecked_1" Checked="CheckBox_Checked_1"></CheckBox>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>

    </Grid>

cs代码

 public Window1()
        {
            InitializeComponent();
            DataTable dt = new DataTable();
            dt.Columns.Add("1", typeof(Boolean));
            dt.Columns.Add("2", typeof(Boolean));
            for (int i = 0; i < 200; i++)
            {
               DataRow dr= dt.NewRow();
               dr[0] = false;
               dr[1] = false;
               dt.Rows.Add(dr);
            }
            dg.ItemsSource = dt.DefaultView;
        }
姜小牙的主页 姜小牙 | 菜鸟二级 | 园豆:248
提问于:2013-02-04 21:03
< >
分享
最佳答案
0

你说的那个

1对于DataGridTemplateColumn 选中效果被丢失,剩余最后选中的行保持选中状态

 解决:我想了一下改一下数据源就行了

把checkbox的事件改成Click

这是前端UI代码

 

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid Margin="0,0,45,17">
        <Grid.RowDefinitions>
            <RowDefinition Height="auto" ></RowDefinition>
        </Grid.RowDefinitions>
        <DataGrid Width="400"  Height="400" AutoGenerateColumns="False" Name="dg" Grid.RowSpan="1" VerticalScrollBarVisibility="Auto"  >
            <DataGrid.Columns>

                <DataGridCheckBoxColumn Binding="{Binding 1}" Width="auto" Header="DataGridCheckBoxColumn" >

                </DataGridCheckBoxColumn>

                <DataGridTemplateColumn Width="auto">
                    <DataGridTemplateColumn.HeaderTemplate>
                        <DataTemplate>
                            <TextBlock>DataGridTemplateColumn</TextBlock>
                        </DataTemplate>
                    </DataGridTemplateColumn.HeaderTemplate>

                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <CheckBox IsChecked="{Binding 2, Mode=TwoWay}"  Click="CheckBox_Click" ></CheckBox>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>                
            </DataGrid.Columns>
        </DataGrid>

    </Grid>
</Window>

 

这是后台代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Data;

namespace WpfApplication2
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        DataTable dt = new DataTable();
        private bool isWheel = false;
        public MainWindow()
        {
            InitializeComponent();                        
            dt.Columns.Add("1", typeof(Boolean));
            dt.Columns.Add("2", typeof(Boolean));
            for (int i = 0; i < 200; i++)
            {
                DataRow _dr = dt.NewRow();
                _dr[0] = false;
                _dr[1] = false;
                if (i == 5 || i == 28 || i == 38)
                {
                    _dr[0] = true;
                    _dr[1] = true;
                }
                dt.Rows.Add(_dr);
            }
            dg.ItemsSource = dt.DefaultView;

        }
           

        public void ChangeDataBase(CheckBox f_CheckBox)
        {
            DataRowView _drv = (DataRowView)dg.SelectedItem;            
            if (_drv != null )
                dt.Rows[dg.SelectedIndex][1]=f_CheckBox.IsChecked;                  
        }

        private void dg_ScrollChanged(object sender, ScrollChangedEventArgs e)
        {
           
        }
      

        private void CheckBox_Click(object sender, RoutedEventArgs e)
        {
            ChangeDataBase((CheckBox)sender);
        }
    }
}
收获园豆:10
li-peng | 小虾三级 |园豆:954 | 2013-02-05 15:12

http://social.msdn.microsoft.com/Forums/zh-CN/wpfzhchs/thread/4d16fa21-7a07-4564-a3ba-3ff651b09b73?prof=required

 

这个是给出的最好答复,其实后台不须手动修改数据源,只需要改为双向绑定即可自动修改数据源

姜小牙 | 园豆:248 (菜鸟二级) | 2013-02-18 10:34

@_刘宏伟_: 

好的我也学习一下去看看

li-peng | 园豆:954 (小虾三级) | 2013-02-18 10:37
其他回答(1)
0

楼上说的有理

panmin | 园豆:268 (菜鸟二级) | 2013-02-07 13:40
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册