해당 화면에서 위와같이 선언해주자.
using AMIS3.HM.ZZ.ZZLIB003.Mvc;
using AMIS3.HM.ZZ.ZZLIB003.Mvc.Exceptions;
using AMIS3.HM.ZZ.ZZLIB003.Mvc.Utils;
using AMIS3.HM.ZZ.ZZLIB003.Mvc.Validation;
using AMIS3.UIFramework.DataModel;
using AMIS3.UIFramework.UI.Controls;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Reflection;
using System.Windows.Forms;
using AMIS3.UIFramework.FxExtension;
using static AMIS3.HM.ZZ.ZZLIB003.Controls.clsEnumExt;
namespace AMIS3.HM.ZZ.ZZLIB003.Controls
{
public static class clsAPanelControlExt
{
/// <summary>
/// 패널 초기화
/// </summary>
/// <param name="p"></param>
/// <history>[2019.07.09 김민철]컨트롤 종류 추가 NumericUpDown</history>
/// <history>[2019.09.19 김동훈]DtpDatePicker 초기화시 빈문자열로 초기화 되도록 변경,
/// 값을 준상태로 초기화할경우는 Dto 또는 Model의 생성자에서 기본값을 세팅하여 Initialize 대신 panel.setData(dto)를 사용하도록 한다.
/// </history>
public static void Initialize(this APanelControl panel)
{
if (panel.Tag is PanelOption)
{
(panel.Tag as PanelOption).Data = null;
}
List<Control> list = new List<Control>();
FindControls(ref list, panel);
foreach (Control control in list)
{
if (control is ATextEdit)
{
(control as ATextEdit).Initialize();
}else if(control is AMemoEdit) // 2022.11.04 오은진 추가
{
(control as AMemoEdit).Initialize();
}else if(control is ADateEdit) // 2022.11.04 오은진추가
{
(control as ADateEdit).Initialize();
}
else if (control is AComboBox)
{
(control as AComboBox).Initialize();
}
else if (control is ACheckEdit)
{
(control as ACheckEdit).Initialize();
}
else if (control is ARadioGroup)
{
(control as ARadioGroup).Initialize();
}
else if (control is ARichTextBox)
{
(control as ARichTextBox).Initialize();
}
else if (control is ALabelControl)
{
if ((control as ALabelControl).AutoSize == false)
{
(control as ALabelControl).Appearance.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
(control as ALabelControl).Appearance.TextOptions.VAlignment = DevExpress.Utils.VertAlignment.Center;
}
}
}
}
/// <summary>
/// 패널 안의 컨트롤 엔터키 바인딩
/// </summary>
/// <param name="panel"></param>
public static void SetEnterKey(this Panel panel)
{
List<Control> list = new List<Control>();
FindControls(ref list, panel);
foreach (Control control in list)
{
if (control is AMemoEdit)
{
(control as AMemoEdit).KeyDown -= PanelExt_KeyDown;
(control as AMemoEdit).KeyDown += PanelExt_KeyDown;
}
else if (control is AComboBox)
{
(control as AComboBox).KeyDown -= PanelExt_KeyDown;
(control as AComboBox).KeyDown += PanelExt_KeyDown;
}
}
}
public static SearchParameter GetParameters(this APanelControl panel)
{
List<Control> list = new List<Control>();
FindControls(ref list, panel);
SearchParameter parameter = new SearchParameter();
foreach (Control control in list)
{
if (control is AComboBox)
{
parameter.Add((control.Tag as ComboBoxOption).DataField, GetControlValue(control));
}
else
{
if (!control.Tag.IsNullOrEmpty())
{
parameter.Add(control.Tag.ToString(), GetControlValue(control));
}
}
}
return parameter;
}
/// <summary>
/// 컨트롤 찾기
/// </summary>
/// <param name="list"></param>
/// <param name="control"></param>
private static void FindControls(ref List<Control> list, Control control)
{
foreach (Control item in control.Controls)
{
if (item.HasChildren)
{
if (item is ATextEdit || item is AMemoEdit || item is AComboBox || item is ADateEdit)
{
//ATextEdit는 컨테이너로 인식하지만 그대로 쓴다.
list.Add(item);
}
else
{
FindControls(ref list, item);
}
}
else
{
list.Add(item);
}
}
}
private static void PanelExt_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
SendKeys.Send("{TAB}");
}
}
public static void SetControl(this APanelControl pnl)
{
List<Control> list = new List<Control>();
FindControlsEx(ref list, pnl);
SetControlEvent(list);
}
private static void SetControlEvent(List<Control> list)
{
foreach (Control item in list)
{
if (item is ACheckEdit)
{
(item as ACheckEdit).CheckedChanged -= CheckEdit_CheckChanged;
(item as ACheckEdit).CheckedChanged += CheckEdit_CheckChanged;
}
}
}
private static void CheckEdit_CheckChanged(object sender, EventArgs e)
{
if (((ACheckEdit)sender).Checked)
{
((ACheckEdit)sender).ForeColor = Color.Blue;
}
else
{
((ACheckEdit)sender).ForeColor = Color.Black;
}
}
private static void FindControlsEx(ref List<Control> list, APanelControl pnl)
{
foreach (Control item in pnl.Controls)
{
if (item.HasChildren)
{
if (item is ATextEdit || item is AMemoEdit || item is AComboBox || item is ADateEdit)
{
//ATextEdit는 컨테이너로 인식하지만 그대로 쓴다.
list.Add(item);
}
else
{
FindControls(ref list, item);
}
}
else
{
list.Add(item);
}
}
}
/// <summary>
/// 데이터 바인딩
/// </summary>
/// <param name="panel"></param>
/// <param name="data"></param>
/// <returns></returns>
public static void SetData(this APanelControl panel, object data)
{
if (panel.Tag is PanelOption)
{
(panel.Tag as PanelOption).Data = data;
}
else
{
panel.Tag = new PanelOption { Data = data };
}
List<Control> list = new List<Control>();
FindControls(ref list, panel);
SetControlDataBind(list, data);
}
/// <summary>
/// 데이터 바인딩 RowBase
/// </summary>
/// <param name="panel">최상위 대상 panel</param>
/// <param name="argDT">서비스단에서 불러온 DataTable</param>
/// <param name="strTagKey">불러온 DataTable에서 컨트롤에 달려있는 Tag값들이 속하는 Column명</param>
/// <param name="strValKey">불러온 DataTable에서 컨트롤에 세팅할 Value값들이 속하는 Column명</param>
public static void SetData(this APanelControl panel, DataTable argDT, string strTagKey, string strValKey)
{
List<Control> list = new List<Control>();
FindControls(ref list, panel);
SetControlDataBind(list, argDT, strTagKey, strValKey);
}
public static void SetDataBinding(this APanelControl panel, object data)
{
if (panel.Tag is PanelOption)
{
(panel.Tag as PanelOption).Data = data;
}
else
{
panel.Tag = new PanelOption { Data = data };
}
List<Control> list = new List<Control>();
FindControls(ref list, panel);
SetControlDataBinding(list, data);
}
/// <summary>
///
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="panel"></param>
/// <returns></returns>
public static T GetData<T>(this APanelControl panel) where T : new()
{
T t = new T();
if (panel.Tag is PanelOption)
{
if ((panel.Tag as PanelOption).Data != null)
{
t = (T)(panel.Tag as PanelOption).Data;
}
}
List<Control> list = new List<Control>();
FindControls(ref list, panel);
return GetData<T>(list, t);
}
public static void GetData(this APanelControl panel, ref DataTable svDt, string argTagNm, string argValNm)
{
FindTagValInControls(ref svDt, panel, argTagNm, argValNm);
}
private static void FindTagValInControls(ref DataTable svDt, Control panel, string argTagNm, string argValNm)
{
DataRow newRow = null;
foreach (Control item in panel.Controls)
{
if (item.HasChildren)
{
if (item is ATextEdit)
{
//ATextEdit는 컨테이너로 인식하지만 그대로 쓴다.
if (!item.Tag.IsNullOrEmpty())
{
newRow = svDt.NewRow();
newRow[argTagNm] = item.Tag.ToString();
newRow[argValNm] = (item as ATextEdit).GetValue();
svDt.Rows.Add(newRow);
}
}
else if (item is AMemoEdit)
{
if (!item.Tag.IsNullOrEmpty())
{
newRow = svDt.NewRow();
newRow[argTagNm] = item.Tag.ToString();
newRow[argValNm] = (item as AMemoEdit).GetValue();
svDt.Rows.Add(newRow);
}
}
else if (item is AComboBox)
{
if (!item.Tag.IsNullOrEmpty())
{
newRow = svDt.NewRow();
newRow[argTagNm] = item.Tag.ToString();
newRow[argValNm] = (item as AComboBox).GetValue();
svDt.Rows.Add(newRow);
}
}
else if (item is ADateEdit)
{
if (!item.Tag.IsNullOrEmpty())
{
newRow = svDt.NewRow();
newRow[argTagNm] = item.Tag.ToString();
newRow[argValNm] = (item as ADateEdit).GetValue();
svDt.Rows.Add(newRow);
}
}
else
{
FindTagValInControls(ref svDt, item, argTagNm, argValNm);
}
}
else
{
if (!item.Tag.IsNullOrEmpty())
{
newRow = svDt.NewRow();
newRow[argTagNm] = item.Tag.To<string>();
if (item is ACheckEdit)
{
newRow[argValNm] = (item as ACheckEdit).GetValue();
}
else if (item is ARadioGroup)
{
newRow[argValNm] = (item as ARadioGroup).GetValue();
}
else if (item is ARichTextBox)
{
newRow[argValNm] = (item as ARichTextBox).GetValue();
}
svDt.Rows.Add(newRow);
}
}
}
}
/// <summary>
/// 컨트롤 테이터 class 반환
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="list"></param>
/// <param name="t"></param>
/// <returns></returns>
private static T GetData<T>(List<Control> list, T t)
{
PropertyInfo[] properties = t.GetType().GetProperties();
foreach (var item in list)
{
string dataField = string.Empty;
if (item.Tag == null || string.IsNullOrWhiteSpace(item.Tag.ToString()) || !item.Enabled)
{
continue;
}
if (item.Tag is IControlOption)
{
dataField = (item.Tag as IControlOption).DataField;
}
else
{
dataField = item.Tag.ToString();
}
if (dataField.Contains("."))
{
string[] temp = dataField.Split(new string[] { "." }, StringSplitOptions.RemoveEmptyEntries);
string fieldName = temp[1];
object obj = t;
PropertyInfo pInfo = null;
for (int i = 0; i < temp.Length; i++)
{
string part = temp[i];
Type type = obj.GetType();
pInfo = type.GetProperty(part);
if (i == 0)
{
obj = pInfo.GetValue(obj, null);
}
else
{
pInfo.SetValue(obj, GetControlValue(item));
}
}
foreach (PropertyInfo info in obj.GetType().GetProperties())
{
if (pInfo.GetValue(obj) != null)
{
continue;
}
if (fieldName.Equals(info.Name))
{
pInfo.SetValue(obj, GetControlValue(item));
}
}
}
else
{
PropertyInfo pi = t.GetType().GetProperty(dataField);
if (pi == null)
{
continue;
}
// 값
object value = GetControlValue(item);
Type type = pi.PropertyType;
// NumericUpDown 오류인한 추가
if (pi.PropertyType == typeof(Int16) ||
pi.PropertyType == typeof(Int32) ||
pi.PropertyType == typeof(Int64) ||
pi.PropertyType == typeof(decimal) ||
pi.PropertyType == typeof(double) ||
pi.PropertyType == typeof(long)
)
{
if (value == null || value.IsNullOrEmpty())
{
value = 0;
}
value = Convert.ChangeType(value.ToString().Replace(",", ""), type);
}
else if (pi.PropertyType == typeof(DateTime?) && value.IsNullOrEmpty())
{
value = null;
}
else if (pi.PropertyType == typeof(DateTime?) && value is string)
{
value = DateTime.Parse(value.ToString());
}
else if (pi.PropertyType == typeof(string) && value is DateTime)
{
throw new AMISException(pi.Name + " DateTimePickerOption의 Databaseformat이 설정 되지 않았습니다");
}
else if (pi.PropertyType.IsEnum && value is string)
{
value = Enum.Parse(pi.PropertyType, value.ToString());
}
else if (pi.PropertyType == typeof(string) && value is decimal)
{
value = value.ToString();
}
else if (pi.PropertyType == typeof(bool))
{
bool isCheck = false;
if (!bool.TryParse(value.ToString(), out isCheck))
{
continue;
}
}
try
{
pi.SetValue(t, value);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
return t;
}
/// <summary>
/// 컨트롤 값가져오기
/// </summary>
/// <param name="item"></param>
/// <returns></returns>
private static object GetControlValue(Control item)
{
if (item is ATextEdit)
{
string value = (item as ATextEdit).GetValue();
if (value.IsNullOrEmpty())
{
return null;
}
else
{
ATextEdit textBox = item as ATextEdit;
if (textBox.Tag is TextBoxOption)
{
TextBoxOption option = textBox.Tag as TextBoxOption;
if (option.DisplayFormat != DateTimeType.None)
{
return DateUtil.stringToDateTime(value, option.DisplayFormat);
}
else
{
return value;
}
}
else
{
return value;
}
}
}
else if (item is ACheckEdit)
{
return (item as ACheckEdit).GetValue();
}
else if (item is AComboBox)
{
return (item as AComboBox).GetValue();
}
else if (item is APictureBox)
{
return (item as APictureBox).GetValue();
}
else if (item is ARadioGroup)
{
return (item as ARadioGroup).GetValue();
}
else if (item is ARichTextBox)
{
return (item as ARichTextBox).GetValue();
}
else if (item is ADateEdit)
{
return (item as ADateEdit).GetValue();
}
return null;
}
/// <summary>
/// 데이터 바인딩
/// </summary>
/// <param name="list"></param>
/// <param name="dto"></param>
/// <returns></returns>
private static void SetControlDataBind(List<Control> list, object dto)
{
PropertyInfo[] properties = dto.GetType().GetProperties();
Dictionary<string, PropertyInfo> dictionary = new Dictionary<string, PropertyInfo>();
foreach (PropertyInfo propertyInfo in properties)
{
dictionary.Add(propertyInfo.Name, propertyInfo);
}
foreach (Control item in list)
{
if (item.Tag == null || string.IsNullOrWhiteSpace(item.Tag.ToString()))
{
continue;
}
string dataField = string.Empty;
if (item.Tag is IControlOption)
{
dataField = (item.Tag as IControlOption).DataField;
}
else
{
dataField = item.Tag.ToString();
}
foreach (PropertyInfo info in properties)
{
if (dataField.Contains("."))
{
string[] temp = dataField.Split(new string[] { "." }, StringSplitOptions.RemoveEmptyEntries);
string field = temp[1];
foreach (PropertyInfo pInfo in info.PropertyType.GetRuntimeProperties())
{
if (pInfo.Name.Equals(field))
{
object obj = dto;
PropertyInfo pinfo = null;
for (int i = 0; i < temp.Length; i++)
{
string part = temp[i];
Type type = obj.GetType();
pinfo = type.GetProperty(part);
if (i == 0)
{
obj = pinfo.GetValue(obj, null);
}
else
{
SetControlValue(item, info.GetValue(dto));
}
}
}
}
continue;
}
if (info.Name.Equals(dataField))
{
object obj = dto.GetPropertieValue(dataField);
SetControlValue(item, obj);
break;
}
}
}
}
private static void SetControlDataBind(List<Control> list, DataTable argDT, string argTagKey, string argValKey)
{
DataColumn[] keyColumn = new DataColumn[2];
keyColumn[0] = argDT.Columns[argTagKey];
argDT.PrimaryKey = keyColumn;
foreach (Control item in list)
{
if (item.Tag == null || string.IsNullOrWhiteSpace(item.Tag.ToString()))
{
continue;
}
string dataField = string.Empty;
if (item.Tag is IControlOption)
{
dataField = (item.Tag as IControlOption).DataField;
}
else
{
dataField = item.Tag.ToString();
}
if (dataField == "PG01100001")
{
dataField = "PG01100001";
}
DataRow rs = argDT.Rows.Find(dataField);
if (!rs.IsNullOrEmpty())
{
if (dataField.Equals(rs[argTagKey].ToString()))
{
SetControlValue(item, rs[argValKey].ToString());
}
}
}
}
/// <summary>
/// 데이터 바인딩
/// </summary>
/// <param name="list"></param>
/// <param name="dto"></param>
/// <returns></returns>
private static void SetControlDataBinding(List<Control> list, object dto)
{
PropertyInfo[] properties = dto.GetType().GetProperties();
foreach (Control item in list)
{
string dataField = string.Empty;
if (item.Tag is IControlOption)
{
dataField = (item.Tag as IControlOption).DataField;
}
else
{
dataField = item.Tag.ToString();
}
foreach (PropertyInfo info in properties)
{
if (dataField.Contains("."))
{
string[] temp = dataField.Split(new string[] { "." }, StringSplitOptions.RemoveEmptyEntries);
string field = temp[1];
foreach (PropertyInfo pInfo in info.PropertyType.GetRuntimeProperties())
{
if (pInfo.Name.Equals(field))
{
object obj = dto;
PropertyInfo pinfo = null;
for (int i = 0; i < temp.Length; i++)
{
string part = temp[i];
Type type = obj.GetType();
pinfo = type.GetProperty(part);
if (i == 0)
{
obj = pinfo.GetValue(obj, null);
}
else
{
item.DataBindings.Add("Text", obj, dataField, true, DataSourceUpdateMode.OnPropertyChanged);
}
}
}
}
continue;
}
if (info.Name.Equals(dataField))
{
object obj = dto.GetPropertieValue(dataField);
item.DataBindings.Clear();
item.DataBindings.CollectionChanged += (s, e) =>
{
(s as ControlBindingsCollection).Control.Refresh();
};
if (item is AComboBox)
{
Binding ComboBoxBinding = new Binding("SelectedValue", dto, dataField, true, DataSourceUpdateMode.OnPropertyChanged);
//ComboBoxBinding.Format += (s, e) =>
//{
//};
//ComboBoxBinding.Parse += (s, e) =>
//{
//};
item.DataBindings.Add(ComboBoxBinding);
}
else if (item is ACheckEdit)
{
Binding CheckBoxBinding = new Binding("Checked", dto, dataField, true, DataSourceUpdateMode.OnPropertyChanged);
CheckBoxBinding.Format += CheckBoxBinding_Format;
CheckBoxBinding.Parse += CheckBoxBinding_Parse;
item.DataBindings.Add(CheckBoxBinding);
}
else if (item is ARadioGroup)
{
//if (RadioBinding.Control != null)
{
ARadioGroup rdo = (item as ARadioGroup);
if (rdo.GetOption() != null)
{
rdo.EditValue = dto.GetPropertieValue(dataField);
}
}
Binding RadioBinding = new Binding("Checked", dto, dataField, true, DataSourceUpdateMode.OnPropertyChanged);
item.DataBindings.Add(RadioBinding);
RadioBinding.Format += (s, e) =>
{
Binding bind = s as Binding;
if (bind.Control != null)
{
string controlValue = (bind.Control as ARadioGroup).GetOption().EditValue;
//Console.WriteLine($"ForMat : { controlValue } == {e.Value}");
e.Value = controlValue.Equals(e.Value);
}
};
RadioBinding.Parse += (s, e) =>
{
Binding bind = s as Binding;
if (bind.Control != null)
{
//if ((bind.Control as ARadioGroup).Checked)
//{
// e.Value = (bind.Control as ARadioGroup).GetOption().EditValue;
//}
//else
//{
// e.Value = string.Empty;
//}
e.Value = (bind.Control as ARadioGroup).GetOption().EditValue;
//Console.WriteLine($"Parse : {e.Value} {(bind.Control as RadioButton).Name}");
}
};
//(RadioBinding.Control as ARadioGroup).Click += (s, e) =>
//{
// (s as ARadioGroup).Checked = true;
//};
}
else if (item is NumericUpDown)
{
item.DataBindings.Add("Value", dto, dataField, true, DataSourceUpdateMode.OnPropertyChanged);
}
else
{
if (dto.GetPropertieValue(dataField) != null)
{
//string value = dto.GetPropertieValue(dataField).ToString();
dto.SetPropertieValue(dataField, dto.GetPropertieValue(dataField));
}
item.DataBindings.Add("Text", dto, dataField, true, DataSourceUpdateMode.OnPropertyChanged);
}
break;
}
}
}
}
private static void CheckBoxBinding_Parse(object sender, ConvertEventArgs e)
{
Binding binding = sender as Binding;
if (binding != null)
{
ACheckEdit checkBox = (binding.Control as ACheckEdit);
e.Value = checkBox.Checked ? checkBox.GetOption().ValueChecked : checkBox.GetOption().ValueUncheck;
}
}
private static void CheckBoxBinding_Format(object sender, ConvertEventArgs e)
{
Binding binding = sender as Binding;
if (binding != null)
{
ACheckEdit checkBox = (binding.Control as ACheckEdit);
e.Value = checkBox.GetOption().ValueChecked.Equals(e.Value);
}
}
/// <summary>
/// 컨트롤 값넣기
/// </summary>
/// <param name="item"></param>
/// <param name="data"></param>
private static void SetControlValue(Control item, object data)
{
if (item is ATextEdit)
{
string value = string.Empty;
if (data != null)
{
value = data.ToString().Trim();
}
(item as ATextEdit).SetValue(value);
}
else if (item is AMemoEdit)
{
string value = string.Empty;
if (data != null)
{
value = data.ToString().Trim();
}
(item as AMemoEdit).SetValue(value);
}
else if (item is ACheckEdit)
{
(item as ACheckEdit).SetValue(data);
}
else if (item is AComboBox)
{
(item as AComboBox).SetValue(data);
}
else if (item is APictureBox)
{
(item as APictureBox).SetValue(data);
}
else if (item is ARadioGroup)
{
(item as ARadioGroup).SetValue(data);
}
else if (item is ARichTextBox)
{
(item as ARichTextBox).SetValue(data);
}
else if (item is ADateEdit)
{
(item as ADateEdit).SetValue(data);
}
}
public static PanelOption GetOption(this APanelControl panel)
{
if (panel.Tag is PanelOption)
{
return panel.Tag as PanelOption;
}
return null;
}
/// <summary>
/// dto 유효성 검사하여 panel의 컨트롤에 에러롤 표시합니다(반드시 BaseForm을 상속받아야 합니다)
///
/// </summary>
/// <param name="panel"></param>
/// <param name="dto"></param>
public static bool Validate<T>(this APanelControl panel) where T : new()
{
bool isValid = true;
try
{
T t = new T();
//BaseDto dto = (panel.Tag as PanelOption).Data as BaseDto;
if (t.GetType().BaseType.Name == "BaseDto")
{
BaseDto dto = GetData<T>(panel) as BaseDto;
dto.Validate();
}
else
{
throw new Exception("BaseDto를 상속해야 합니다");
}
}
catch (AMISValidationException)
{
isValid = false;
}
return isValid;
}
}
public class PanelOption
{
public List<Control> RequiredControls;
public object Data;
public PanelOption()
{
RequiredControls = new List<Control>();
}
public void AddRequiredControl(Control control)
{
if (!RequiredControls.Contains(control))
{
RequiredControls.Add(control);
}
}
}
}