您的位置:首页 > 编程语言 > C#

C# wpf 在DataGrid中添加带文本信息CheckBox

2013-10-18 21:13 489 查看
最近在使用C#写工具,发现DataGrid中默认只能添加不带文本信息的CheckBox,找了N多资料都木有成功。。

本来已经放弃了,已经通过2列来实现带文本信息的checkbox, 但是在调试SelectedCellsChanged事件过程中发现第二个参数 SelectedCellsChangedEventArgs e中蕴含着玄机,如下((System.Windows.Controls.VirtualizedCellInfoCollection)(((System.Windows.Controls.VirtualizedCellInfoCollection)(e.AddedCells))._owner._selectedCells))._owner._currentCellContainer.EditingElement

他的内容既然是:{System.Windows.Controls.CheckBox 内容: IsChecked:True} System.Windows.FrameworkElement {System.Windows.Controls.CheckBox}

这不就是第3列的checkbox吗?如果能把他的content加上内容,不就成功了吗?

经过多次验证终于成功实现:

通过DataGridColumn的GetCellContent获得对应每行的控件.

另外在如下事件中,内容会被清掉,所以在排序后,需要重新进行对checkbox的修改.可能还有其他情况也需要重新修改..

1.Sorting

2.ScrollChangedEvent:

this.dataGrid.AddHandler(ScrollViewer.ScrollChangedEvent, new ScrollChangedEventHandler(ScrollChangedEventHandler));

public void ScrollChangedEventHandler(object sender, ScrollChangedEventArgs e)
{
bInitDataGridCheckBox = false;
}

代码如下:

public partial class MainWindow : Window
{

// 通过DataTable可以实现动态增加行和列
DataTable mDataTable = new DataTable();
private bool mbUpdateDataGridCheckBox = true;
public MainWindow()
{
InitializeComponent();
this.dataGrid.ItemsSource = mDataTable.DefaultView;

mDataTable.Columns.Add(new DataColumn("ID", typeof(int)));
mDataTable.Columns.Add(new DataColumn("文本", typeof(string)));
mDataTable.Columns.Add(new DataColumn("CheckBox1", typeof(bool)));
mDataTable.Columns.Add(new DataColumn("CheckBox2", typeof(bool)));

for (int i = 0; i < 5; i++ )
{
DataRow dr = mDataTable.NewRow();
dr["ID"] = mDataTable.Rows.Count;
dr["文本"] = "文本" + i;
dr["CheckBox1"] = true;
dr["CheckBox2"] = true;
mDataTable.Rows.Add(dr);
}

}

private void dataGrid_LayoutUpdated(object sender, EventArgs e)
{
if (mbUpdateDataGridCheckBox)
{
foreach (DataRowView drv in this.dataGrid.Items)
{
Console.WriteLine("aaa");
foreach (DataGridColumn dgc in this.dataGrid.Columns)
{
var content = dgc.GetCellContent(drv);
if (content !=null
&& content.GetType() == typeof(CheckBox))
{
CheckBox cb = content as CheckBox;
cb.Content = "点我";
}
}
}

mbUpdateDataGridCheckBox = false;
}
}

private void dataGrid_Sorting(object sender, DataGridSortingEventArgs e)
{
mbUpdateDataGridCheckBox = true;
}
private void dataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
}

private void dataGrid_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)
{
}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: