获得DataGrid单元格失败
我用下面的扩展方法获得DataGrid的一个Row数据,可是
dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex); 总是返回null,请问有人知道是为什么吗?绑定本身应该是成功的,DataGrid内有数据
dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex); 总是返回null,请问有人知道是为什么吗?绑定本身应该是成功的,DataGrid内有数据
public static DataGridRow GetRow(this DataGrid dataGrid, int rowIndex)
{
DataGridRow rowContainer = (DataGridRow)dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex);
if (rowContainer == null)
{
dataGrid.UpdateLayout();
dataGrid.ScrollIntoView(dataGrid.Items[rowIndex]);
rowContainer = (DataGridRow)dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex);
}
return rowContainer;
}
...全文
请发表友善的回复…
发表回复
r4 2014-03-15
- 打赏
- 举报
我现在的思路是把希望传进convert的字符串放在CellTemplate的Grid控件的Tag属性上,这样就需要在绑定了数据之后修改对应列的Grid.Tag的内容,可是现在我没办法获得Grid控件啊。
r4 2014-03-15
- 打赏
- 举报
CustomGanttLine _A = new CustomGanttLine() { Percentage0 = 0.2f, Percentage1 = 0.25f, Percentage2 = 0.02f, Percentage3 = 0.174f, Sum = 245.0f, Year = 2013, Months = _monthsX };
CustomGanttLine _B = new CustomGanttLine() { Percentage0 = 0.4f, Percentage1 = 0.15f, Percentage2 = 0.12f, Percentage3 = 0.574f, Sum = 1245.0f,Year = 2014, Months = _monthsX };
Dictionary<string, CustomGanttLine> _data = new Dictionary<string, CustomGanttLine>();
_data.Add("2013", _A);
_data.Add("2014", _B);
GanttData _dataX = new GanttData() { data = _data };
ObservableCollection<GanttData> _X = new ObservableCollection<GanttData>() { _dataX };
this.dataGrid1.ItemsSource = _X;
DataGridTemplateColumn dataGridTemplateColumnX = this.dataGrid1.Columns[0] as DataGridTemplateColumn;
DataTemplate celltemplate = dataGridTemplateColumnX.CellTemplate;
object temp = GetCell(0, 0).Content as object;
代码是这样的
可是GetRow总是返回null,难道是因为我的colum是动态添加的吗?
添加colum的代码是这样的
DataGridTemplateColumn dgTempColX = new DataGridTemplateColumn();
dgTempColX.HeaderTemplate = this.dataGrid1.Columns[0].HeaderTemplate;
var dataGridTemplateColumn = this.dataGrid1.Columns[0] as DataGridTemplateColumn;
if (dataGridTemplateColumn != null)
{
dgTempColX.CellTemplate = dataGridTemplateColumn.CellTemplate;
dgTempColX.CellTemplate.Resources["Year"] = "2014";
}
dataGrid1.Columns.Add(dgTempColX);
Bonjour-你好 2014-03-14
- 打赏
- 举报
我那个是演示,你的cell是模板,那么返回后,强制转换类型为你的模板就可以了啊,如果你还需要更改模板里面某个控件的属性,就继续用GetVisualChild方法查找。
要不你直接说你找到cell后还要怎么处理,我下午看看有没有时间试试。
r4 2014-03-14
- 打赏
- 举报
我用了这个方法,可是还是返回null啊,我的Cell是个模板,不是TextBox,就是前个帖子里你教我做的那个
Bonjour-你好 2014-03-14
- 打赏
- 举报
用上次那个模板试了,没问题啊。
r4 2014-03-14
- 打赏
- 举报
其实我就是没搞懂如何强制转换为模板类型,应为我即使直接返回object类型,仍旧只是null
object obj =dataGrid.ItemContainerGenerator.ContainerFromIndex(0);
也不行,晕死了
Bonjour-你好 2014-03-13
- 打赏
- 举报
private DataGridCell GetCell(int row, int column)
{
DataGridRow rowContainer = GetRow(row);
if (rowContainer != null) {
DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer);
DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
if (cell == null) {
dataGrid1.ScrollIntoView(rowContainer, dataGrid1.Columns[column]);
cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
}
return cell;
}
return null;
}
private DataGridRow GetRow(int index)
{
DataGridRow row = (DataGridRow)dataGrid1.ItemContainerGenerator.ContainerFromIndex(index);
if (row == null) {
dataGrid1.UpdateLayout();
dataGrid1.ScrollIntoView(dataGrid1.Items[index]);
row = (DataGridRow)dataGrid1.ItemContainerGenerator.ContainerFromIndex(index);
}
return row;
}
private static T GetVisualChild<T>(Visual parent) where T : Visual
{
T child = default(T);
int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < numVisuals; i++) {
Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
child = v as T;
if (child == null) {
child = GetVisualChild<T>(v);
}
if (child != null) {
break;
}
}
return child;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
TextBlock temp = GetCell(0, 0).Content as TextBlock;
if ( temp!= null) {
MessageBox.Show(temp.Text.ToString());
}
}
小恒丶 2014-03-12
- 打赏
- 举报
绑定的list rowContainer = (改为你绑定的list)dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex);
r4 2014-03-12
- 打赏
- 举报
不好意思,没看懂啊,请问“绑定的list rowContainer ”是什么意思?,我的DataGrid是用DataTemplate声明的,上面有好几个控件。