本来想做成左右箭头操作左右两张datagrid数据表的,后来根据实际需求,要结合数据库查询和存储数据,遂做成以下效果:
具体代码如下:
首先,新建XAML页面如下:
<sdk:DataGridTemplateColumn xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
x:Class="NEPTUNE.DevConfigure.DataGridSelectColumn"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300"
d:DesignWidth="400">
<sdk:DataGridTemplateColumn.HeaderStyle>
<Style TargetType="ContentControl">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<CheckBox Content="选 择"
VerticalContentAlignment="Center"
VerticalAlignment="Center"
Loaded="OnHeaderCheckBoxLoaded"/>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</sdk:DataGridTemplateColumn.HeaderStyle>
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding IsSelected,Mode=TwoWay}"
VerticalAlignment="Center"
HorizontalAlignment="Center" />
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
然后添加两个类文件:DataGridExtensions.cs和DataGridRBExtensions.cs
public partial class DataGridSelectColumn : DataGridTemplateColumn
{
private DataGrid _ownerDataGrid;
private CheckBox _headerCheckBox;
private Dictionary<object, MarkObject> _markObjects;
public event EventHandler SelectedItemChanged;
public DataGridSelectColumn()
{
InitializeComponent();
IsReadOnly = true;
_markObjects = new Dictionary<object, MarkObject>();
}
public DataGrid OwnerDataGrid
{
get { return _ownerDataGrid; }
set
{
_ownerDataGrid = value;
_ownerDataGrid.LoadingRow += OnLoadingRow;
}
}
public void SelecteAll()
{
if (_headerCheckBox != null)
_headerCheckBox.IsChecked = true;
SetAllSelectedStates(true);
}
public void UnselectAll()
{
if (_headerCheckBox != null)
_headerCheckBox.IsChecked = false;
SetAllSelectedStates(false);
}
public List<T> GetSelectedItems<T>()
{
List<T> result = new List<T>();
if (_ownerDataGrid.ItemsSource != null)
{
var enu = _ownerDataGrid.ItemsSource.GetEnumerator();
while (enu.MoveNext())
{
if (GetMarkObject(enu.Current).IsSelected)
result.Add((T)enu.Current);
}
}
ClearItems();
return result;
}
public List<T> GetUnSelectedItems<T>()
{
List<T> result = new List<T>();
if (_ownerDataGrid.ItemsSource != null)
{
var enu = _ownerDataGrid.ItemsSource.GetEnumerator();
while (enu.MoveNext())
{
if (!(GetMarkObject(enu.Current).IsSelected))
result.Add((T)enu.Current);
}
}
ClearItems();
return result;
}
public void SetSelectedItems(IList items)
{
if (_ownerDataGrid.ItemsSource == null)
return;
var enu = _ownerDataGrid.ItemsSource.GetEnumerator();
while (enu.MoveNext())
{
GetMarkObject(enu.Current).IsSelected = items.Contains(enu.Current);
}
}
public void ClearItems()
{
var enu = _ownerDataGrid.ItemsSource.GetEnumerator();
List<object> list = new List<object>();
while (enu.MoveNext())
{
list.Add(enu.Current);
}
List<object> removableObjects = new List<object>();
foreach (var item in _markObjects)
{
if (list.Contains(item.Key) == false)
{
removableObjects.Add(item.Key);
}
}
for (int i = 0; i < removableObjects.Count; i++)
{
_markObjects.Remove(removableObjects[i]);
}
}
private void OnHeaderCheckBoxLoaded(object sender, RoutedEventArgs e)
{
_headerCheckBox = sender as CheckBox;
_headerCheckBox.Loaded -= OnHeaderCheckBoxLoaded;
//_headerCheckBox.Checked += (s2, e2) => SetAllSelectedStates(true);
//_headerCheckBox.Unchecked += (s2, e2) => SetAllSelectedStates(false);
}
private void OnLoadingRow(object sender, DataGridRowEventArgs e)
{
object dataContext = e.Row.DataContext;
FrameworkElement element = this.GetCellContent(e.Row);
element.DataContext = GetMarkObject(dataContext);
}
private void SetAllSelectedStates(bool value)
{
if (_ownerDataGrid.ItemsSource == null)
return;
var enu = _ownerDataGrid.ItemsSource.GetEnumerator();
while (enu.MoveNext())
{
GetMarkObject(enu.Current).IsSelected = value;
}
ClearItems();
}
private MarkObject GetMarkObject(Object obj)
{
if (_markObjects.ContainsKey(obj) == false)
{
MarkObject markObject;
markObject = new MarkObject();
_markObjects.Add(obj, markObject);
markObject.PropertyChanged += (s, e) =>
{
if (e.PropertyName == "IsSelected")
{
if (SelectedItemChanged != null)
{
SelectedItemChanged(this, EventArgs.Empty);
}
}
};
}
return _markObjects[obj];
}
}
public static class DataGridExtensions
{
internal static DataGridSelectColumn GetSelectColumn(this DataGrid dataGrid)
{
DataGridSelectColumn result = null;
for (int i = 0; i < dataGrid.Columns.Count; i++)
{
result = dataGrid.Columns[i] as DataGridSelectColumn;
if (result != null)
break;
}
return result;
}
public static void EnableSelect(this DataGrid dataGird)
{
var column = GetSelectColumn(dataGird);
column.OwnerDataGrid = dataGird;
}
public static void SelectAll(this DataGrid dataGrid)
{
DataGridSelectColumn column = GetSelectColumn(dataGrid);
if (column == null)
throw new Exception("No Select Column");
column.SelecteAll();
}
public static void UnselectAll(this DataGrid dataGrid)
{
DataGridSelectColumn column = GetSelectColumn(dataGrid);
if (column == null)
throw new Exception("No Select Column");
column.UnselectAll();
}
public static List<T> GetSelectedItems<T>(this DataGrid dataGrid)
{
DataGridSelectColumn column = GetSelectColumn(dataGrid);
if (column == null)
throw new Exception("No Select Column");
return column.GetSelectedItems<T>();
}
public static List<T> GetUnSelectedItems<T>(this DataGrid dataGrid)
{
DataGridSelectColumn column = GetSelectColumn(dataGrid);
if (column == null)
throw new Exception("No Select Column");
return column.GetUnSelectedItems<T>();
}
public static void SetSelectedItems(this DataGrid dataGrid, IList items)
{
DataGridSelectColumn column = GetSelectColumn(dataGrid);
if (column == null)
throw new Exception("No Select Column");
column.SetSelectedItems(items);
}
}
调用程序为:
<pre name="code" class="csharp">private void setvalue()
{
switch (type)
{
case 1://tcp设备
{
ud.Clear();
//dg_selected.ItemsSource = dg_unselect.GetSelectedItems<T_SBTCP>();//脱离数据库的界面显示选择项和去除选择项
//dg_unselect.ItemsSource = dg_unselect.GetUnSelectedItems<T_SBTCP>();
foreach (T_SBTCP t in dg_unselect.GetSelectedItems<T_SBTCP>())//调用
{
T_UserDev devs = new T_UserDev();
if (comb_user.SelectedIndex != -1)
{
devs.user_id = userid;
devs.sb_id = int.Parse(t.id.ToString());
devs.p_id = 0;
devs.type_id = int.Parse(t.SBTYPE.ToString());
ud.Add(devs);
}
}
}
break;<pre name="code" class="html">
如果不操作数据库可以参考上面注掉的两条代码进行实现。