/// <summary> /// /// </summary> /// <param name="dataSource"></param> /// <param name="dataMember"></param> /// <param name="hereLevel"></param> protected void SetDataRows(object dataSource, string dataMember, int hereLevel) { try { this.DisplayManager.BeginBatchOperation(); this.DataRows.Clear(); System.Collections.Generic.Dictionary <string, Xceed.Grid.DataRow> masterRows = new System.Collections.Generic.Dictionary <string, Xceed.Grid.DataRow>(); DataTable dt = dataSource as DataTable; if (dt == null) { IEnumerable list = dataSource as IEnumerable; if (list != null) { foreach (object entity in list) { for (int i = 0; i <= hereLevel; ++i) { Xceed.Grid.DataRow gridRow = null; if (i < hereLevel || i == 0) { if (!masterRows.ContainsKey(GetListValue(entity, m_levelParents[i]).ToString())) { if (i == 0) { gridRow = this.DataRows.AddNew(); masterRows[GetListValue(entity, m_levelParents[i]).ToString()] = gridRow; } else { gridRow = masterRows[GetListValue(entity, m_levelParents[i - 1]).ToString()].DetailGrids[0].DataRows.AddNew(); } } else { gridRow = masterRows[GetListValue(entity, m_levelParents[i]).ToString()]; } } else { gridRow = masterRows[GetListValue(entity, m_levelParents[i - 1]).ToString()].DetailGrids[0].DataRows.AddNew(); } gridRow.EndEdit(); gridRow.Tag = entity; foreach (string columnName in m_gridColumnNames[i]) { GridColumnInfo info = m_infos[columnName]; switch (info.GridColumnType) { case GridColumnType.Normal: if (gridRow.Cells[info.GridColumnName] != null && !string.IsNullOrEmpty(info.PropertyName)) { gridRow.Cells[info.GridColumnName].Value = EntityScript.GetPropertyValue(entity, info.Navigator, info.PropertyName); } break; case GridColumnType.WarningColumn: gridRow.Cells[info.GridColumnName].Value = (gridRow.Cells[info.GridColumnName].ParentColumn as WarningColumn).Calculate(entity); break; case GridColumnType.StatColumn: case GridColumnType.ExpressionColumn: case GridColumnType.ImageColumn: case GridColumnType.SplitColumn: case GridColumnType.CheckColumn: case GridColumnType.NoColumn: break; default: throw new NotSupportedException("invalid GridColumnType of " + info.GridColumnType); } // //gridRow.Cells[columnName].Value = GetListValue(entity, columnName); } gridRow.EndEdit(); } } } Dictionary <Xceed.Grid.DataRow, bool> m_processdRows = new Dictionary <Xceed.Grid.DataRow, bool>(); foreach (object entity in list) { for (int i = 0; i < hereLevel; ++i) { Xceed.Grid.DataRow gridRow = masterRows[GetListValue(entity, m_levelParents[i]).ToString()]; if (!m_processdRows.ContainsKey(gridRow)) { m_processdRows[gridRow] = true; } else { continue; } foreach (string columnName in m_gridColumnNames[i]) { GridColumnInfo info = m_infos[columnName]; switch (info.GridColumnType) { case GridColumnType.StatColumn: { if (gridRow.DetailGrids.Count == 0) { throw new ArgumentException("stateColumn should has detailgrids."); } gridRow.Cells[info.GridColumnName].Value = Feng.Utils.ConvertHelper.ChangeType( MySummaryRow.GetSummaryResult(gridRow.DetailGrids[0].GetSortedDataRows(true), info.PropertyName), gridRow.Cells[info.GridColumnName].ParentColumn.DataType); } break; } } } } } else { foreach (System.Data.DataRow dataRow in dt.Rows) { for (int i = 0; i <= hereLevel; ++i) { Xceed.Grid.DataRow gridRow = null; if (i < hereLevel || i == 0) { if (!masterRows.ContainsKey(dataRow[m_levelParents[i]].ToString())) { if (i == 0) { gridRow = this.DataRows.AddNew(); masterRows[dataRow[m_levelParents[i]].ToString()] = gridRow; } else { gridRow = masterRows[dataRow[m_levelParents[i - 1]].ToString()].DetailGrids[0].DataRows.AddNew(); } } else { gridRow = masterRows[dataRow[m_levelParents[i]].ToString()]; } } else { gridRow = masterRows[dataRow[m_levelParents[i - 1]].ToString()].DetailGrids[0].DataRows.AddNew(); } // 如果在下方EndEdit,DetailGrid可能不会生成,不知原因 gridRow.EndEdit(); gridRow.Tag = dataRow; foreach (string columnName in m_gridColumnNames[i]) { GridColumnInfo info = m_infos[columnName]; switch (info.GridColumnType) { case GridColumnType.Normal: { if (!dt.Columns.Contains(columnName)) { continue; } if (gridRow.Cells[info.GridColumnName] != null && !string.IsNullOrEmpty(info.PropertyName)) { gridRow.Cells[info.GridColumnName].Value = (dataRow[columnName] == System.DBNull.Value ? null : Feng.Utils.ConvertHelper.TryIntToEnum(dataRow[columnName], GridColumnInfoHelper.CreateType(m_infos[columnName]))); } } break; case GridColumnType.WarningColumn: throw new NotSupportedException("warning column is not supported in datarow."); case GridColumnType.StatColumn: case GridColumnType.ExpressionColumn: case GridColumnType.ImageColumn: case GridColumnType.SplitColumn: case GridColumnType.CheckColumn: case GridColumnType.NoColumn: break; default: throw new NotSupportedException("invalid GridColumnType of " + info.GridColumnType); } } gridRow.EndEdit(); } } Dictionary <Xceed.Grid.DataRow, bool> m_processdRows = new Dictionary <Xceed.Grid.DataRow, bool>(); foreach (System.Data.DataRow dataRow in dt.Rows) { for (int i = 0; i < hereLevel; ++i) { Xceed.Grid.DataRow gridRow = masterRows[dataRow[m_levelParents[i]].ToString()]; if (!m_processdRows.ContainsKey(gridRow)) { m_processdRows[gridRow] = true; } else { continue; } foreach (string columnName in m_gridColumnNames[i]) { GridColumnInfo info = m_infos[columnName]; switch (info.GridColumnType) { case GridColumnType.StatColumn: { if (gridRow.DetailGrids.Count == 0) { throw new ArgumentException("stateColumn should has detailgrids."); } gridRow.Cells[info.GridColumnName].Value = Feng.Utils.ConvertHelper.ChangeType( MySummaryRow.GetSummaryResult(gridRow.DetailGrids[0].GetSortedDataRows(true), info.PropertyName), gridRow.Cells[info.GridColumnName].ParentColumn.DataType); } break; } } } } } this.AfterLoadData(); } finally { this.DisplayManager.EndBatchOperation(); this.DisplayManager.OnPositionChanged(System.EventArgs.Empty); } }
/// <summary> /// 根据Entity的值设置row's cell值 /// </summary> /// <param name="grid"></param> /// <param name="entity"></param> /// <param name="row"></param> public static void SetDataRowsIListData(this IBoundGrid grid, object entity, Xceed.Grid.DataRow row) { // 如果同一个实体类,只是里面内容变了,重新设置不会设置成功 row.Tag = null; if (entity == null) { return; } row.Tag = entity; foreach (GridColumnInfo info in ADInfoBll.Instance.GetGridColumnInfos(grid.GridName)) { try { switch (info.GridColumnType) { case GridColumnType.Normal: if (row.Cells[info.GridColumnName] != null && !string.IsNullOrEmpty(info.PropertyName)) { row.Cells[info.GridColumnName].Value = EntityScript.GetPropertyValue(entity, info.Navigator, info.PropertyName); } break; case GridColumnType.WarningColumn: row.Cells[info.GridColumnName].Value = (row.Cells[info.GridColumnName].ParentColumn as WarningColumn).Calculate(entity); break; case GridColumnType.StatColumn: { if (row.DetailGrids.Count == 0) { return; //throw new ArgumentException("stateColumn should has detailgrids."); } row.Cells[info.GridColumnName].Value = Feng.Utils.ConvertHelper.ChangeType( MySummaryRow.GetSummaryResult(row.DetailGrids[0].GetSortedDataRows(true), info.PropertyName), row.Cells[info.GridColumnName].ParentColumn.DataType); } break; case GridColumnType.ExpressionColumn: { //var info2 = info; //var row2 = row; //Feng.Async.AsyncHelper.Start(() => //{ // if (info2.PropertyName.Contains("%")) // { // return EntityScript.CalculateExpression(info2.PropertyName, entity); // } // else // { // return Feng.Utils.ProcessInfoHelper.TryExecutePython(info2.PropertyName, // new Dictionary<string, object>() { { "entity", entity }, { "row", row2 } }); // } //}, (result) => //{ // row2.Cells[info2.GridColumnName].Value = result; //}); if (info.PropertyName.Contains("%")) { row.Cells[info.GridColumnName].Value = EntityScript.CalculateExpression(info.PropertyName, entity); } else { row.Cells[info.GridColumnName].Value = ProcessInfoHelper.TryExecutePython(info.PropertyName, new Dictionary <string, object>() { { "entity", entity }, { "row", row } }); } } break; case GridColumnType.ImageColumn: { var i = Feng.Windows.ImageResource.Get(info.PropertyName); row.Cells[info.GridColumnName].Value = i == null ? null : i.Reference; } break; case GridColumnType.CheckColumn: { row.Cells[info.GridColumnName].Value = false; } break; case GridColumnType.NoColumn: case GridColumnType.SplitColumn: break; case GridColumnType.UnboundColumn: { try { row.Cells[info.GridColumnName].Value = Feng.Utils.ConvertHelper.ChangeType(info.PropertyName, Feng.Utils.ReflectionHelper.GetTypeFromName(info.TypeName)); } catch (Exception) { } } break; case GridColumnType.IndexColumn: { row.Cells[info.GridColumnName].Value = row.Index + 1; } break; default: throw new NotSupportedException("invalid GridColumnType of " + info.GridColumnType); } } catch (Exception ex) { ExceptionProcess.ProcessWithResume(new ArgumentException(info.PropertyName + " info is invalid!", ex)); } } }