/// <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();
}
}