首页 新闻 会员 周边

WPF DataGrid的一个问题

0
悬赏园豆:50 [已解决问题] 解决于 2012-11-05 09:43

假设说,你有200条数据,而你的窗口是盛不下200条数据的,也就是说会有一部分数据超出窗口的显示范围,那么当用楼上的方法遍历数据的时候,一旦遍历到200条数据中超出屏幕范围的数据就会出错。或者说,我们把DataGrid的滚动条往下拉,使DataGrid的第一条数据远远地超出窗口的显示范围,那么遍历时第一条数据就会出错。再或者,当我们把窗口调小点的话这种情况更容易发生。请求解法!!!

xiao22y的主页 xiao22y | 初学一级 | 园豆:157
提问于:2012-11-01 13:20
< >
分享
最佳答案
0

DataGrid的行是虚拟的,不可见的部分是不存在的,如果用GetCellContent这时会出现空值,所以要对数据源进行遍历,对数据源进行查询

收获园豆:50
panmin | 菜鸟二级 |园豆:268 | 2012-11-01 14:59

我的每一行前面都有checkbox

如果只遍历选中的行?

数据源怎么判断那一行是不是被选中呢?

xiao22y | 园豆:157 (初学一级) | 2012-11-01 15:17

@xiao22y: 不知道你的数据源是什么样的,举个例子,如果数据源是一个dataTable或者一个class类可以在里面添加一列或者是属性来保存checkbox的状态是true或者是false,dataTable要绑定好列,class类设置好通知,下面是绑定就简单了

 <DataGrid Name="dg" ItemsSource="{Binding}" AutoGenerateColumns="False">
<DataGrid.Columns>
    <DataGridCheckBoxColumn Binding="{Binding IsSelected}"/>
</DataGrid.Columns>
</DataGrid>
panmin | 园豆:268 (菜鸟二级) | 2012-11-01 15:35

@panmin: 这是我的绑定代码你帮我看看

private void GetModelDataList()
        {
            try
            {
                string conn = "data source=192.168.1.239;initial catalog=OfflineCDManage;persist security info=True;user id=sa;password=bctop";
                string sql = "select Row_Number() over (order by getdate()) ID, ID DiskID, Name DiskName, BarCode DiskBarcode, Capacity DiskCapacity, (capacity - OccupySpace) FreeSpace " +
                              "from BlueDisk d inner join (select DiskID, SUM(FileSize) OccupySpace from DiskFile  group by DiskID) as f on d.ID = f.DiskID where UseTypeID=1000 order by Name";
                SqlDataAdapter da = new SqlDataAdapter(sql, conn);
                System.Data.DataSet ds = new System.Data.DataSet();
                da.Fill(ds, "BlueDisk");
                DataGridDiskList.ItemsSource = ds.Tables["BlueDisk"].DefaultView;
                //List<BlueDisk> queryDiskList = null;
                //using (OfflineCDManageEntities db = new OfflineCDManageEntities())
                //{
                //    queryDiskList = db.BlueDisks.Where(disk => disk.UseTypeID == 1000 && disk.ShelfID.HasValue && disk.ShelfRowIndex.HasValue && disk.ShelfCellIndex.HasValue && disk.ShelfCellOrderIndex.HasValue).ToList();

                //}
                //DataGridDiskList.ItemsSource = queryDiskList;
            }
            catch (Exception mye)
            {
                System.Windows.Forms.MessageBox.Show(mye.ToString());
                throw;
            }


        }

xaml

<DataGrid FontSize="12" AutoGenerateColumns="False" Background="Transparent" Height="544" BorderThickness="0" CellStyle="{StaticResource CellCenterAlignment}" 
                      Name="DataGridDiskList" Width="787" RowHeight="30" CanUserAddRows="False" FontWeight="Bold">
                
                <DataGrid.Columns>
                    <DataGridCheckBoxColumn Binding="{Binding Path=IsSelected,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type DataGridRow}}}">
                        <DataGridCheckBoxColumn.HeaderTemplate>
                            <DataTemplate>
                                <CheckBox Content="全选" Name="cbSelectAll" Uid="{Binding Path=ID}" Tag="{Binding Path=DiskID}" Checked="cbSelectAll_Checked" Unchecked="cbSelectAll_Unchecked" />
                            </DataTemplate>
                        </DataGridCheckBoxColumn.HeaderTemplate>
                    </DataGridCheckBoxColumn>
                    <DataGridTextColumn Header="光盘编号" HeaderStyle="{StaticResource TableTileCenterAlignment}" Binding="{Binding Path=DiskID}" Width="130" IsReadOnly="True" FontSize="12" ></DataGridTextColumn>
                    <DataGridTextColumn Header="光盘名称" HeaderStyle="{StaticResource TableTileCenterAlignment}" Binding="{Binding Path=DiskName}" Width="150" IsReadOnly="True"></DataGridTextColumn>
                    <DataGridTextColumn Header="光盘条码" HeaderStyle="{StaticResource TableTileCenterAlignment}" Binding="{Binding Path=DiskBarcode}" Width="150" IsReadOnly="True"></DataGridTextColumn>
                    <DataGridTextColumn Header="光盘大小" HeaderStyle="{StaticResource TableTileCenterAlignment}" Binding="{Binding Path=DiskCapacity}" Width="150" IsReadOnly="True"></DataGridTextColumn>
                    <DataGridTextColumn Header="剩余空间" HeaderStyle="{StaticResource TableTileCenterAlignment}" Binding="{Binding Path=FreeSpace}" Width="150" IsReadOnly="True"></DataGridTextColumn>
                </DataGrid.Columns>
            </DataGrid>

具体怎么弄能说下吗?我还是糊涂的

xiao22y | 园豆:157 (初学一级) | 2012-11-02 09:15

@xiao22y: 这样绑定数据源之后还有什么问题出现吗?如果要遍历的话,就直接遍历ds.Tables["BlueDisk"]不就行了吗,它的IsSelected属性不就能知道这一行是否被选中了吗

panmin | 园豆:268 (菜鸟二级) | 2012-11-02 11:31

@panmin: 怎么去判断IsSelected的属性?我这里不会啊?

xiao22y | 园豆:157 (初学一级) | 2012-11-02 14:37

@xiao22y: 你的DataTable里面没有IsSelected这个列吗?那你是怎么绑定上去的呢;如果真的没有你也可以给查询出来的DataTable添加这么一列啊,用完删除不就行了。

DataColumn column = new DataColumn();
column.DataType = typeof(bool);
column.ColumnName = "IsSelected";
table.Columns.Add(column);

最后循环DataTable这个总该会了吧

DataColumn

panmin | 园豆:268 (菜鸟二级) | 2012-11-02 16:04

@panmin: 我binding那个Isselected是实现全选的,我向DataTable里添加了一列,更改CheckBox的状态 新加列的值却是不变的,还需要进行其他的动态更新吗?

xiao22y | 园豆:157 (初学一级) | 2012-11-02 17:14

@xiao22y: 真没法说了,自己去看看吧,真心没觉得难在哪里http://download.csdn.net/detail/pm_854537719/4726547

panmin | 园豆:268 (菜鸟二级) | 2012-11-02 17:49

@panmin: 我换用class类做数据源了,不过还是谢谢你!!

xiao22y | 园豆:157 (初学一级) | 2012-11-05 09:43
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册