综合应用WPF/WCF/WF/LINQ之三十九:实现一个简单的DataGrid之获取某格的原始(或当前)行(或列)的Index
2008-02-23 22:00
951 查看
为什么这些Index很难取得呢?这是因为ListView控件的RoutedEventArgs中的信息太少了,而且这个控件又支持Column的直接拖动重排,以及数据的排序,这就导致行、列的Index有原始和当前值两个版本。
在这几个Index中,又尤其以SourceColumnIndex最难取得。由于本程序的DataTemplate都是以XamlReader.Load的方式实现的,如下:
1 string content = string.Format("<common:DataGridButton Name=\"Button{0}\" ColumnIndex=\"{1}\" Content=\"{2}\" Value=\"{{Binding Path={3}}}\" />", i.ToString(), i.ToString(), column.ButtonContent, column.ButtonValuePath);
2 column.CellTemplate = XamlReader.Load(XmlReader.Create(new StringReader(string.Format(template, content)))) as DataTemplate; 这就给我们一个机会,可以随意指定嵌入控件的各种属性。我们可以将SourceColumnIndex的值保存在嵌入控件的某个属性,如Tag属性中,或者干脆在继承于原始控件的自定义控件中加入一个ColumnIndex的属性,用于保存SourceColumnIndex的值。
这样处理后,我们即可在该控件中注册一个事件,并在RoutedEventHandler指定的方法中,使用(e.OriginalSource as DataGridButton).ColumnIndex的方式来取得当前格的SourceColumnIndex。有了SourceColumnIndex之后,其它各个Index就比较容易得到了:
1 int sourceRowIndex = (this.ItemsSource as IList).IndexOf(this.SelectedItem);
2 int sourceColumnIndex = (e.OriginalSource as DataGridButton).ColumnIndex;
3
4 int currentRowIndex = this.Items.IndexOf(this.SelectedItem);
5 int currentColumnIndex = (this.View as GridView).Columns.IndexOf(this._DataGridColumns[sourceColumnIndex]);
6
7 this.RaiseEvent(new DataGridEventArgs(ButtonClickEvent, sourceRowIndex, sourceColumnIndex, currentRowIndex, currentColumnIndex)); 这样一来,我们就可以非常方便的在该控件的事件中直接使用SourceRowIndex、SourceColumnIndex、CurrentRowIndex、CurrentColumnIndex等的值了。
在这几个Index中,又尤其以SourceColumnIndex最难取得。由于本程序的DataTemplate都是以XamlReader.Load的方式实现的,如下:
1 string content = string.Format("<common:DataGridButton Name=\"Button{0}\" ColumnIndex=\"{1}\" Content=\"{2}\" Value=\"{{Binding Path={3}}}\" />", i.ToString(), i.ToString(), column.ButtonContent, column.ButtonValuePath);
2 column.CellTemplate = XamlReader.Load(XmlReader.Create(new StringReader(string.Format(template, content)))) as DataTemplate; 这就给我们一个机会,可以随意指定嵌入控件的各种属性。我们可以将SourceColumnIndex的值保存在嵌入控件的某个属性,如Tag属性中,或者干脆在继承于原始控件的自定义控件中加入一个ColumnIndex的属性,用于保存SourceColumnIndex的值。
这样处理后,我们即可在该控件中注册一个事件,并在RoutedEventHandler指定的方法中,使用(e.OriginalSource as DataGridButton).ColumnIndex的方式来取得当前格的SourceColumnIndex。有了SourceColumnIndex之后,其它各个Index就比较容易得到了:
1 int sourceRowIndex = (this.ItemsSource as IList).IndexOf(this.SelectedItem);
2 int sourceColumnIndex = (e.OriginalSource as DataGridButton).ColumnIndex;
3
4 int currentRowIndex = this.Items.IndexOf(this.SelectedItem);
5 int currentColumnIndex = (this.View as GridView).Columns.IndexOf(this._DataGridColumns[sourceColumnIndex]);
6
7 this.RaiseEvent(new DataGridEventArgs(ButtonClickEvent, sourceRowIndex, sourceColumnIndex, currentRowIndex, currentColumnIndex)); 这样一来,我们就可以非常方便的在该控件的事件中直接使用SourceRowIndex、SourceColumnIndex、CurrentRowIndex、CurrentColumnIndex等的值了。
相关文章推荐
- 综合应用WPF/WCF/WF/LINQ之三十八:实现一个简单的DataGrid之总体介绍
- 综合应用WPF/WCF/WF/LINQ之四十:实现一个简单的DataGrid之CheckBox已勾选的项的保存
- 综合应用WPF/WCF/WF/LINQ之三十六:实现一个完全封装的SortableListView控件
- 综合应用WPF/WCF/WF/LINQ之三十四:在XBAP项目中模拟弹出一个自定义的“模态窗口”
- 综合应用WPF/WCF/WF/LINQ之四:创建一个StateMachineWorkflow 推荐
- 综合应用WPF/WCF/WF/LINQ之二十五:使用CustomControl技术编写一个翻页控件
- 综合应用WPF/WCF/WF/LINQ之三:采用用代码创建的方式实现CheckListBox的CustomControl
- 综合应用WPF/WCF/WF/LINQ之二十四:使用UserControl技术编写一个翻页控件
- 综合应用WPF/WCF/WF/LINQ之三十三:XBAP项目中打开和关闭新的窗口
- 综合应用WPF/WCF/WF/LINQ之十:界面开发人员的Solution
- 综合应用WPF/WCF/WF/LINQ之三十:代码生成器之DBMLToDAL
- 综合应用WPF/WCF/WF/LINQ之十四:LINQ的ORM功能的代码简化能力
- 综合应用WPF/WCF/WF/LINQ之二十七:代码生成器之DBMLToProcedure
- 综合应用WPF/WCF/WF/LINQ之三十五:解决CheckListBox控件中选择项丢失的问题
- 综合应用WPF/WCF/WF/LINQ之二十:ListView控件中几个常用的扩展方法
- 综合应用WPF/WCF/WF/LINQ之三十一:代码生成器之ContractToBLL
- 综合应用WPF/WCF/WF/LINQ之一:DEV-WOW 作品源代码公布
- 综合应用WPF/WCF/WF/LINQ之十六:关于更改XBAP程序的配置文件的问题
- 综合应用WPF/WCF/WF/LINQ之二十一:关于Visio生成数据库字典的问题
- 综合应用WPF/WCF/WF/LINQ之二十九:代码生成器之DBMLToCode