WPF DataGrid 遇到的小问题
1) 在使用WPF的DataGrid时,虽然在绑定数据时使用的mode是twoway,
但在具体使用的时候,因为界面输入过快,数据的传输具有一定的延迟。
这样会有时导致异常的出现,解决这个办法我们可以自己调用函数datagrid.commiteEdit();
来手动传输数据。
2)在输入数据后,界面没有及时的更新某些信息,如行数,以及在删除某行后,
行数没有重新排列。只要使用datagir.Items.Refresh(); 就可以使得界面刷新。
3)获得DataGrid中的某一行或者某一个单元格
#region DataGrid Cell Row /// <summary> /// get the row of datagrid /// </summary> /// <param name="Index"></param> [0,n-1] /// <returns>DataGridRow</returns> private DataGridRow getRow(int Index) { try { DataGridRow row = (DataGridRow)dataGrid.ItemContainerGenerator.ContainerFromIndex(Index); if (row == null) { dataGrid.UpdateLayout(); dataGrid.ScrollIntoView(dataGrid.Items[Index]); row = (DataGridRow)dataGrid.ItemContainerGenerator.ContainerFromIndex(Index); } return row; } catch (Exception ex) { log.Error("getRow()----- exception occurred," + ex.Message); return null; } } /// <summary> /// get the cell of dataGrid by an existing row /// </summary> /// <param name="rowIndex"></param> [0,n-1] /// <param name="columnIndex"></param> [0,n-1] /// <returns>DataGridCell</returns> private DataGridCell getCell(int rowIndex, int columnIndex) { try { DataGridRow rowContainer = getRow(rowIndex); if (rowContainer != null) { DataGridCellsPresenter presenter = getVisualChild<DataGridCellsPresenter>(rowContainer); if (presenter == null) { dataGrid.ScrollIntoView(rowContainer, dataGrid.Columns[columnIndex]); presenter = getVisualChild<DataGridCellsPresenter>(rowContainer); } DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(columnIndex); if (cell == null) { dataGrid.ScrollIntoView(rowContainer, dataGrid.Columns[columnIndex]); cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(columnIndex); } return cell; } // end of if (rowContainer != null) } catch (Exception ex) { log.Error("getCell()---- exception occurred, " + ex.Message); } return null; } /// <summary> /// get the visual child /// </summary> /// <typeparam name="T"></typeparam> /// <param name="parent"></param> /// <returns></returns> private static T getVisualChild<T>(Visual parent) where T : Visual { try { 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; } catch (Exception ex) { log.Error("getVisualChild()---- exception occurred, " + ex.Message); return null; } } #endregion