DTOと画面項目と自動的に設定できる共通方法(asp.net)

    /// <summary>
    /// ページに関する共通処理
    /// </summary>
    public class PageUtil
    {
        /// <summary>
        /// 各コントロールの値を、DTO内の属性の設定に応じDTOに回収する。
        /// </summary>
        /// <param name="dto">DTO</param>
        /// <param name="page">ページ</param>
        /// <param name="searchAll">Trueの場合、子コントロールを再帰的に検索する</param>
        public static void SetDtoFromPage(IBaseDTO dto, Page page, bool searchAll)
        {
            Control[] allControls = GetControls(page, searchAll);

            foreach (PropertyInfo info in dto.GetType().GetProperties())
            {
                foreach (ControlIdAttribute att in info.GetCustomAttributes(typeof(ControlIdAttribute), false))
                {
                    foreach (Control con in allControls)
                    {
                        if (con.ID == att.ControlId)
                        {
                            PropertyInfo target = con.GetType().GetProperty(att.PropertyName);
                            if (target != null && target.CanRead)
                            {
                                if (target.GetValue(con, null) == null)
                                    info.SetValue(dto, null, null);
                                else
                                {
                                    string str = target.GetValue(con, null).ToString();
                                    if (PropertyValueEnum.NONE.Equals(att.PropertyValueEx))
                                        info.SetValue(dto, target.GetValue(con, null), null);
                                    else if (PropertyValueEnum.NULL_STRING.Equals(att.PropertyValueEx))
                                        info.SetValue(dto, StringUtil.GetNullString(str), null);
                                    else if (PropertyValueEnum.LIKE_STRING.Equals(att.PropertyValueEx))
                                        info.SetValue(dto, StringUtil.GetLikeString(str), null);
                                    else if (PropertyValueEnum.FRONT_LIKE_STRING.Equals(att.PropertyValueEx))
                                        info.SetValue(dto, StringUtil.GetFrontLikeString(str), null);
                                    else if (PropertyValueEnum.AFTER_LIKE_STRING.Equals(att.PropertyValueEx))
                                        info.SetValue(dto, StringUtil.GetAfterLikeString(str), null);
                                    else if (PropertyValueEnum.NULL_DATETIME.Equals(att.PropertyValueEx))
                                        info.SetValue(dto, StringUtil.GetNullDateTime(str), null);
                                    else if (PropertyValueEnum.FIRST_TIME.Equals(att.PropertyValueEx))
                                        info.SetValue(dto, StringUtil.GetFirstTime(str), null);
                                    else if (PropertyValueEnum.LAST_TIME.Equals(att.PropertyValueEx))
                                        info.SetValue(dto, StringUtil.GetLastTime(str), null);
                                    else if (PropertyValueEnum.DATE_ONLY.Equals(att.PropertyValueEx))
                                        info.SetValue(dto, StringUtil.GetFirstTime(str), null);
                                    else if (PropertyValueEnum.DATE_STR_ONLY.Equals(att.PropertyValueEx))
                                        info.SetValue(dto, StringUtil.ToEraShortString(str), null);
                                    else if (PropertyValueEnum.DECIMAL.Equals(att.PropertyValueEx))
                                        info.SetValue(dto, StringUtil.ToDecimal(str), null);
                                    else if (PropertyValueEnum.NULL_DECIMAL.Equals(att.PropertyValueEx))
                                        info.SetValue(dto, StringUtil.ToNullDecimal(str), null);
                                }
                                break;
                            }
                        }
                    }
                }
            }
        }

        /// <summary>
        /// 各コントロールの値を、DTO内の属性の設定に応じDTOに回収する。
        /// </summary>
        /// <param name="dto">DTO</param>
        /// <param name="datas">CSVデータ(一行分)</param>
        /// <param name="searchAll">Trueの場合、子コントロールを再帰的に検索する</param>
        public static void SetDtoFromCsv(IBaseDTO dto, string[] datas, bool searchAll)
        {
            foreach (PropertyInfo info in dto.GetType().GetProperties())
            {
                foreach (CsvImportAttribute att in info.GetCustomAttributes(typeof(CsvImportAttribute), false))
                {
                    info.SetValue(dto, datas[att.CsvIndex], null);
                }
            }
        }

        /// <summary>
        /// DTOのプロパティ値を属性の設定に応じ各コントロールに設定する。
        /// </summary>
        /// <param name="dto">DTO</param>
        /// <param name="page">ページ</param>
        /// <param name="searchAll">Trueの場合、子コントロールを再帰的に検索する</param>
        public static void SetPageFromDto(IBaseDTO dto, Page page, bool searchAll)
        {
            Control[] allControls = GetControls(page, searchAll);

            foreach (PropertyInfo info in dto.GetType().GetProperties())
            {
                foreach (ControlIdAttribute att in info.GetCustomAttributes(typeof(ControlIdAttribute), false))
                {
                    foreach (Control con in allControls)
                    {
                        if (con.ID == att.ControlId)
                        {
                            PropertyInfo target = con.GetType().GetProperty(att.PropertyName);
                            if (target != null && target.CanWrite)
                            {
                                target.SetValue(con, info.GetValue(dto, null), null);
                                break;
                            }
                        }
                    }
                }
            }
        }

        /// <summary>
        /// 主キーコントロールの状態を設定する
        /// </summary>
        /// <param name="pkList">主キー名リスト</param>
        /// <param name="isReadOnly">ReadOnlyであるか</param>
        /// <param name="dto">DTO</param>
        /// <param name="page">ページ</param>
        /// <param name="searchAll">Trueの場合、子コントロールを再帰的に検索する</param>
        public static void SetPkControlStatus(List<string> pkList, bool isReadOnly, IBaseDTO dto, Page page, bool searchAll)
        {
            Control[] allControls = GetControls(page, searchAll);

            foreach (string keyName in pkList)
            {
                foreach (ControlIdAttribute att in dto.GetType().GetProperty(keyName).GetCustomAttributes(typeof(ControlIdAttribute), false))
                {
                    foreach (Control con in allControls)
                    {
                        if (con.ID == att.ControlId)
                        {
                            PropertyInfo target = con.GetType().GetProperty("ReadOnly");
                            if (target != null && target.CanWrite)
                            {
                                target.SetValue(con, isReadOnly, null);
                                break;
                            }
                            else if (target == null)
                            {
                                target = con.GetType().GetProperty("Enabled");
                                if (target != null && target.CanWrite)
                                {
                                    target.SetValue(con, !isReadOnly, null);
                                    break;
                                }
                            }
                        }
                    }
                }
            }
        }

        /// <summary>
        /// 検索条件をCSV形式へ変換する
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        public static string ConvertConditionToCSV(IBaseDTO dto)
        {
            StringBuilder sb = new StringBuilder();
            SortedDictionary<int, string> items = new SortedDictionary<int, string>();
            foreach (PropertyInfo info in dto.GetType().GetProperties())
            {
                foreach (CsvConditionAttribute att in info.GetCustomAttributes(typeof(CsvConditionAttribute), false))
                {
                    if (att.CsvIndex < 0)
                        continue;
                    else
                    {
                        if (items.ContainsKey(att.CsvIndex))
                            continue;
                        if (info.GetValue(dto, null) == null)
                            items.Add(att.CsvIndex, att.Title + ",");
                        else
                        {
                            string str = info.GetValue(dto, null).ToString();
                            if (PropertyValueEnum.NONE.Equals(att.PropertyValueEx))
                                items.Add(att.CsvIndex, att.Title + "," + str);
                            else if (PropertyValueEnum.NULL_STRING.Equals(att.PropertyValueEx))
                                items.Add(att.CsvIndex, att.Title + "," + str);
                            else if (PropertyValueEnum.LIKE_STRING.Equals(att.PropertyValueEx))
                                items.Add(att.CsvIndex, att.Title + "," + StringUtil.GetValueOfLikeString(str));
                            else if (PropertyValueEnum.FRONT_LIKE_STRING.Equals(att.PropertyValueEx))
                                items.Add(att.CsvIndex, att.Title + "," + StringUtil.GetValueOfFrontLikeString(str));
                            else if (PropertyValueEnum.AFTER_LIKE_STRING.Equals(att.PropertyValueEx))
                                items.Add(att.CsvIndex, att.Title + "," + StringUtil.GetValueOfAfterLikeString(str));
                            else if (PropertyValueEnum.NULL_DATETIME.Equals(att.PropertyValueEx))
                                items.Add(att.CsvIndex, att.Title + "," + StringUtil.ToEraTimeString(str));
                            else if (PropertyValueEnum.FIRST_TIME.Equals(att.PropertyValueEx))
                                items.Add(att.CsvIndex, att.Title + "," + StringUtil.ToEraTimeString(str));
                            else if (PropertyValueEnum.LAST_TIME.Equals(att.PropertyValueEx))
                                items.Add(att.CsvIndex, att.Title + "," + StringUtil.ToEraTimeString(str));
                            else if (PropertyValueEnum.DATE_ONLY.Equals(att.PropertyValueEx))
                                items.Add(att.CsvIndex, att.Title + "," + StringUtil.ToEraString(str));
                            else if (PropertyValueEnum.DATE_STR_ONLY.Equals(att.PropertyValueEx))
                                items.Add(att.CsvIndex, att.Title + "," + StringUtil.ToEraString(str));
                            else if (PropertyValueEnum.DECIMAL.Equals(att.PropertyValueEx))
                                items.Add(att.CsvIndex, att.Title + "," + StringUtil.FormatNumberNotComma(str));
                            else if (PropertyValueEnum.NULL_DECIMAL.Equals(att.PropertyValueEx))
                                items.Add(att.CsvIndex, att.Title + "," + StringUtil.FormatNumberNotComma(str));
                        }
                        break;
                    }
                }
            }
            foreach (string line in items.Values)
                sb.AppendLine(line);
            return sb.ToString();
        }

        /// <summary>
        /// 一覧データをCSV形式へ変換する
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        public static string ConvertDatasToCSV(IList<IBaseDTO> list)
        {
            StringBuilder sb = new StringBuilder();
            SortedDictionary<int, string> items = new SortedDictionary<int, string>();
            string line;
            foreach (IBaseDTO dto in list)
            {
                items.Clear();
                foreach (PropertyInfo info in dto.GetType().GetProperties())
                {
                    foreach (CsvDataAttribute att in info.GetCustomAttributes(typeof(CsvDataAttribute), false))
                    {
                        if (att.CsvIndex < 0)
                            continue;
                        else
                        {
                            if (items.ContainsKey(att.CsvIndex))
                                continue;
                            if (info.GetValue(dto, null) == null)
                            {
                                if (PropertyValueEnum.DECIMAL.Equals(att.PropertyValueEx))
                                    items.Add(att.CsvIndex, "0");
                                else
                                    items.Add(att.CsvIndex, "");
                            }
                            else
                            {
                                string str = info.GetValue(dto, null).ToString();
                                if (PropertyValueEnum.NONE.Equals(att.PropertyValueEx))
                                    items.Add(att.CsvIndex, str);
                                else if (PropertyValueEnum.NULL_STRING.Equals(att.PropertyValueEx))
                                    items.Add(att.CsvIndex, str);
                                else if (PropertyValueEnum.LIKE_STRING.Equals(att.PropertyValueEx))
                                    items.Add(att.CsvIndex, StringUtil.GetValueOfLikeString(str));
                                else if (PropertyValueEnum.FRONT_LIKE_STRING.Equals(att.PropertyValueEx))
                                    items.Add(att.CsvIndex, StringUtil.GetValueOfFrontLikeString(str));
                                else if (PropertyValueEnum.AFTER_LIKE_STRING.Equals(att.PropertyValueEx))
                                    items.Add(att.CsvIndex, StringUtil.GetValueOfAfterLikeString(str));
                                else if (PropertyValueEnum.NULL_DATETIME.Equals(att.PropertyValueEx))
                                    items.Add(att.CsvIndex, StringUtil.ToEraTimeString(str));
                                else if (PropertyValueEnum.FIRST_TIME.Equals(att.PropertyValueEx))
                                    items.Add(att.CsvIndex, StringUtil.ToEraTimeString(str));
                                else if (PropertyValueEnum.LAST_TIME.Equals(att.PropertyValueEx))
                                    items.Add(att.CsvIndex, StringUtil.ToEraTimeString(str));
                                else if (PropertyValueEnum.DATE_ONLY.Equals(att.PropertyValueEx))
                                    items.Add(att.CsvIndex, StringUtil.ToEraString(str));
                                else if (PropertyValueEnum.DATE_STR_ONLY.Equals(att.PropertyValueEx))
                                    items.Add(att.CsvIndex, StringUtil.ToEraString(str));
                                else if (PropertyValueEnum.DECIMAL.Equals(att.PropertyValueEx))
                                    items.Add(att.CsvIndex, StringUtil.FormatNumberNotComma(str));
                                else if (PropertyValueEnum.NULL_DECIMAL.Equals(att.PropertyValueEx))
                                    items.Add(att.CsvIndex, StringUtil.FormatNumberNotComma(str));
                            }
                            break;
                        }
                    }
                }
                line = "";
                foreach (string str in items.Values)
                    line += str + ",";
                if (line.LastIndexOf(",") >= 0)
                    line = line.Remove(line.LastIndexOf(","));
                sb.AppendLine(line);
            }
            return sb.ToString();
        }

        /// <summary>
        /// グリッドのヘッダー行の文言をCSV形式へ変換する
        /// </summary>
        /// <param name="gvr"></param>
        /// <returns></returns>
        public static string ConvertGridViewHeaderToCSV(IBaseDTO dto)
        {
            StringBuilder sb = new StringBuilder();
            SortedDictionary<int, string> items = new SortedDictionary<int, string>();
            string line = "";
            foreach (PropertyInfo info in dto.GetType().GetProperties())
            {
                foreach (CsvDataAttribute att in info.GetCustomAttributes(typeof(CsvDataAttribute), false))
                {
                    if (att.CsvIndex < 0)
                        continue;
                    else
                    {
                        if (items.ContainsKey(att.CsvIndex))
                            continue;
                        else
                            items.Add(att.CsvIndex, att.Title);
                        break;
                    }
                }
            }
            foreach (string str in items.Values)
                line += str + ",";
            if (line.LastIndexOf(",") >= 0)
                line = line.Remove(line.LastIndexOf(","));
            sb.AppendLine(line);

            return sb.ToString();
        }

        /// <summary>
        /// 対象コントロール以下に存在するコントロールを再帰的に検索して配列に設定して戻します。
        /// </summary>
        /// <param name="top">対象コントロール</param>
        /// <param name="searchAll">Trueの場合、子コントロールを再帰的に検索する</param>
        /// <returns>全コントロール配列</returns>
        /// <remarks>
        /// 引数に指定されたコントロール(Web フォーム/コンテナ/コントロール)に
        /// 従属する子コントロールを再帰的に検索し、全コントロールリストを配列に
        /// 設定して戻します。
        /// </remarks>
        private static Control[] GetControls(Control top, bool searchAll)
        {
            List<Control> buff = new List<Control>();
            foreach (Control control in top.Controls)
            {
                buff.Add(control);
                if (searchAll)
                    buff.AddRange(GetControls(control, searchAll));
            }
            return buff.ToArray();
        }

    }

转载于:https://my.oschina.net/cjkall/blog/195901

猜你喜欢

转载自blog.csdn.net/weixin_34296641/article/details/91756240