Esempio n. 1
0
        /// <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);
            }
        }
Esempio n. 2
0
        /// <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));
                }
            }
        }