WPF 用CSharp代码实现DataGrid多行选中

xqandpan 2011-11-24 10:39:43
如题,WPF的DataGrid控件,ItemSource是DataView。希望能用CSharp代码实现多行的选中高亮。选中单行没问题,多行选中没找到能用的属性。SelectedItems只能读,无法进行设置操作。
...全文
1134 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zcyfbiwarning 2014-03-03
  • 打赏
  • 举报
回复 1
这个选中的思路不是这样的,虽然SelectedItems是只读的,但其子元素并不是只读的。所以我们可以正常调用其方法,如Clear() Add等方法。当需要多选Items的时候,只需要把数据源之中对应的item添加到SelectedItems即可。下面代码可以各行选中表格内的行

                for (int i = 0; i < dataGrid.Items.Count; ++i)
                {
                    if (i % 2 == 0)
                    {
                        dataGrid.SelectedItems.Add(dataGrid.Items[i]);
                    }
                }

xqandpan 2011-11-25
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 fallincloud 的回复:]

当年没有DataGrid,不过貌似和ListView差不多。
我以前写过个在后台控制ListView的选中状态的程序。
部分如下:

数据源:
C# code

private ObservableCollection<TestData> m_fileItemsSource; // listview的数据源


TestData定义如下:
C# code
publ……
[/Quote]

我大概明白你的思路了,就是指DataGrid的第一列做一个隐藏的CheckBox列,然后尝试修改这一列的CheckBox对象的IsChecked属性,我试试看能不能实现。貌似DataGrid和从前自己实现列表显示的时候的做法有些不一样。
xqandpan 2011-11-24
  • 打赏
  • 举报
回复
考虑过遍历DataGrid,由于ItemSource是DataView的,因此对Items进行遍历的时候,每行的对象实际上是DataRowView,就算比对出来了是我要高亮选中的数据,也无法设置Background或Select状态。
zxh198841 2011-11-24
  • 打赏
  • 举报
回复
循环Datagrid的值和SelectedItems的值比对,相同的就设置下
xqandpan 2011-11-24
  • 打赏
  • 举报
回复
问题就是后台选中多行如何操作。能提供一个示例吗?SelectedItem、SelectedIndex都只能设定一行被选中。SelectedItems只能读,无法设置。SelectedValue也是只能设定一行的值,谢谢。
kingdom_0 2011-11-24
  • 打赏
  • 举报
回复
放一个CheckBox列,后台选中多行,获取选中的CheckBox的Parent,设定高亮样式。
fallincloud 2011-11-24
  • 打赏
  • 举报
回复
当年没有DataGrid,不过貌似和ListView差不多。
我以前写过个在后台控制ListView的选中状态的程序。
部分如下:

数据源:

private ObservableCollection<TestData> m_fileItemsSource; // listview的数据源

TestData定义如下:
public class TestData :INotifyPropertyChanged
{
public TestData(){}

private String m_appearName;
public String AppearName
{
get { return m_appearName; }
set
{
if (m_appearName == value) return;
m_appearName = value;
RaisePropertyChanged("AppearName");
}
}


private bool m_checked;
public bool IsChecked
{
get { return m_checked; }

set
{
if (m_checked == value) return;
m_checked = value;
RaisePropertyChanged("IsChecked");
}
}

}


XAML如下:

<GridViewColumn Width="28">
<GridViewColumn.CellTemplate>
<DataTemplate>
<CheckBox Margin="0"
VerticalAlignment="Center"
IsChecked="{Binding IsChecked}"
Tag="{Binding Index}"
Checked="CheckBox_Checked"
Unchecked="CheckBox_Unchecked"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>

后台代码就可以通过修改数据源的IsChecked属性来实现了。
希望能有所启发
xqandpan 2011-11-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 fallincloud 的回复:]

没怎么用过DataGrid,
但SelectionMode="Extended"不行么
[/Quote]
不行的哈。SelectionMode='Extended'只能限定在选择的时候可以选择多行(需要按住Ctrl或Shift)。在CSharp代码里面,还是设置不了多行同时选中的。
fallincloud 2011-11-24
  • 打赏
  • 举报
回复
没怎么用过DataGrid,
但SelectionMode="Extended"不行么

8,757

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧