422 lines
17 KiB
C#
422 lines
17 KiB
C#
using CloudBuilder.Gui.DependencyInjection;
|
||
using Krypton.Toolkit;
|
||
using Microsoft.AspNetCore.Authorization;
|
||
using Microsoft.Extensions.DependencyInjection;
|
||
using System.Collections;
|
||
using System.Collections.Concurrent;
|
||
using System.ComponentModel;
|
||
using System.Data;
|
||
using System.Data.SqlTypes;
|
||
using System.Globalization;
|
||
using System.Reflection;
|
||
|
||
namespace CloudBuilder.Gui
|
||
{
|
||
public class GuiBindingContext
|
||
{
|
||
private List<Control> bindingControls = new List<Control>();
|
||
private BindingContextAttributeProvider provider = null!;
|
||
public object BindingObject;
|
||
|
||
public GuiBindingContext()
|
||
{
|
||
}
|
||
|
||
private static BindingContextAttributeProvider GetProvider()
|
||
{
|
||
return ServiceHelper.GetService<BindingContextAttributeProvider>() ??
|
||
throw new InvalidOperationException("BindingContextAttributeProvider is not registered in the service GetProvider().");
|
||
}
|
||
|
||
public void BindingControls(params IComponent[] cc)
|
||
{
|
||
foreach (IComponent c in cc)
|
||
{
|
||
BindingControls(c);
|
||
}
|
||
}
|
||
|
||
public void BindingControls(List<IComponent> cc)
|
||
{
|
||
BindingControls(cc.ToArray());
|
||
}
|
||
|
||
public void BindingControls(IComponent c)
|
||
{
|
||
if (!(c is Control)) return;
|
||
if (provider == null) provider = GetProvider();
|
||
if (provider.HasCustomAttribute((Control)c) && !bindingControls.Contains((Control)c))
|
||
{
|
||
bindingControls.Add((Control)c);
|
||
return;
|
||
}
|
||
|
||
BindingControls(((Control)c).Controls);
|
||
}
|
||
|
||
public void BindingControls(Control.ControlCollection cc)
|
||
{
|
||
IEnumerator enumerator = cc.GetEnumerator();
|
||
while (enumerator.MoveNext())
|
||
{
|
||
Control current = (Control)enumerator.Current;
|
||
BindingControls(current);
|
||
}
|
||
}
|
||
|
||
|
||
public void DataBind(object o, AbstractForm page)
|
||
{
|
||
BindingControls(page.Controls);
|
||
DataBind(o);
|
||
}
|
||
|
||
public void DataBind(object o, AbstractPage page)
|
||
{
|
||
BindingControls(page.Controls);
|
||
DataBind(o);
|
||
}
|
||
|
||
public void DataBind(object o)
|
||
{
|
||
if (o == null) return;
|
||
|
||
BindingObject = o;
|
||
provider = GetProvider();
|
||
BindingContextCustomAttribute customAttribute = null;
|
||
foreach (Control c in bindingControls)
|
||
{
|
||
customAttribute = provider.GetCustomAttribute(c);
|
||
if (customAttribute == null) continue;
|
||
//權限綁定時,是沒有BindDataName值的
|
||
if (string.IsNullOrEmpty(customAttribute.BindDataName)) continue;
|
||
//只寫和None,不綁定值
|
||
if (customAttribute.BindDirection == EnumBindDirection.None || customAttribute.BindDirection == EnumBindDirection.WriteOnly) continue;
|
||
|
||
PropertyInfo pi = BindingObject.GetType().GetProperty(customAttribute.BindDataName);
|
||
|
||
if (pi == null) continue;
|
||
|
||
var value = pi.GetValue(BindingObject, null);
|
||
|
||
SetValue(c, value, customAttribute.BindFormat);
|
||
}
|
||
}
|
||
|
||
public void ResetColor()
|
||
{
|
||
foreach (Control c in bindingControls)
|
||
{
|
||
if (!(c is TextBox)) continue;
|
||
|
||
//if (System.Drawing.SystemColors.Desktop == customAttribute.BackColor) continue;
|
||
|
||
if (!(c is Control)) continue;
|
||
|
||
((Control)c).BackColor = System.Drawing.SystemColors.Control;
|
||
}
|
||
}
|
||
|
||
public void DataPack()
|
||
{
|
||
if (BindingObject == null) return;
|
||
if (bindingControls == null || bindingControls.Count == 0) return;
|
||
|
||
object value = null;
|
||
BindingContextCustomAttribute customAttribute = null;
|
||
|
||
foreach (Control c in bindingControls)
|
||
{
|
||
customAttribute = provider.GetCustomAttribute(c);
|
||
|
||
if (customAttribute == null) continue;
|
||
|
||
//權限綁定時,是沒有BindDataName值的
|
||
if (string.IsNullOrEmpty(customAttribute.BindDataName)) continue;
|
||
//只读和None,不綁定值
|
||
if (customAttribute.BindDirection == EnumBindDirection.ReadOnly || customAttribute.BindDirection == EnumBindDirection.None) continue;
|
||
|
||
PropertyInfo pi = BindingObject.GetType().GetProperty(customAttribute.BindDataName);
|
||
|
||
if (pi == null) continue;
|
||
|
||
value = GetValue(c, pi.PropertyType.Name, customAttribute.BindFormat);
|
||
|
||
//if (value is string && "[continue][N/A]" == (Convert.ToString(value))) continue;//ExRadioButton
|
||
|
||
pi.SetValue(BindingObject, value, null);
|
||
}
|
||
}
|
||
|
||
|
||
public void SetValue(Control c, object value, string bindFormat)
|
||
{
|
||
BindingContextCustomAttribute customAttribute = provider.GetCustomAttribute(c);
|
||
if (c is KryptonTextBox)
|
||
{
|
||
((KryptonTextBox)c).SetValue(value, customAttribute.BindFormat);
|
||
}
|
||
else if (c is KryptonComboBox)
|
||
{
|
||
((KryptonComboBox)c).SetValue(value);
|
||
}
|
||
else if (c is KryptonCheckBox)
|
||
{
|
||
((KryptonCheckBox)c).SetValue(value);
|
||
}
|
||
else if (c is KryptonDateTimePicker)
|
||
{
|
||
((KryptonDateTimePicker)c).SetValue(value, customAttribute.BindFormat);
|
||
}
|
||
if (c is KryptonMaskedTextBox)
|
||
{
|
||
((KryptonMaskedTextBox)c).SetValue(value, customAttribute.BindFormat);
|
||
}
|
||
if (c is KryptonCheckedListBox)
|
||
{
|
||
((KryptonCheckedListBox)c).SetValue(QuotedString.DelimiteredListToArray((string)value));
|
||
}
|
||
if (c is KryptonListBox)
|
||
{
|
||
((KryptonListBox)c).SetValue(QuotedString.DelimiteredListToArray((string)value));
|
||
}
|
||
else if (c is KryptonRadioButton)
|
||
{
|
||
((KryptonRadioButton)c).SetValue(value);
|
||
}
|
||
}
|
||
public object GetValue(Control c, string type, string bindFormat)
|
||
{
|
||
if (c is KryptonTextBox)
|
||
{
|
||
if (type.ToLower() == "string")
|
||
{
|
||
return ((KryptonTextBox)c).Text.Trim();
|
||
}
|
||
else if (type.ToLower() == "nullable`1" || type.ToLower() == "datetime" || type.ToLower() == "sqldatetime")
|
||
{
|
||
if (type.ToLower() == "datetime" && string.IsNullOrEmpty(((KryptonTextBox)c).Text))
|
||
return DBNull.Value;
|
||
else if (type.ToLower() == "sqldatetime" && string.IsNullOrEmpty(((KryptonTextBox)c).Text))
|
||
return SqlDateTime.Null;
|
||
else
|
||
if (!string.IsNullOrEmpty(bindFormat))
|
||
return DateTime.ParseExact(((KryptonTextBox)c).Text.Trim(), bindFormat, CultureInfo.InvariantCulture, DateTimeStyles.None);
|
||
else
|
||
return DateTime.Parse(((KryptonTextBox)c).Text.Trim(), CultureInfo.InvariantCulture, DateTimeStyles.None);
|
||
}
|
||
else if (type.ToLower() == "decimal")
|
||
{
|
||
if (string.IsNullOrEmpty(((KryptonTextBox)c).Text))
|
||
return 0m;
|
||
if (!string.IsNullOrEmpty(bindFormat))
|
||
return Decimal.Parse(Convert.ToDecimal(((KryptonTextBox)c).Text).ToString(bindFormat));
|
||
else
|
||
return Convert.ToDecimal(((KryptonTextBox)c).Text);
|
||
}
|
||
else if (type.ToLower() == "int" || type.ToLower() == "int32" || type.ToLower() == "int16")
|
||
{
|
||
if (string.IsNullOrEmpty(((KryptonTextBox)c).Text))
|
||
return 0;
|
||
return Convert.ToInt32(Convert.ToDecimal(((KryptonTextBox)c).Text));
|
||
}
|
||
else if (type.ToLower() == "int64")
|
||
{
|
||
if (string.IsNullOrEmpty(((KryptonTextBox)c).Text))
|
||
return 0;
|
||
return Convert.ToInt64(Convert.ToDecimal(((KryptonTextBox)c).Text));
|
||
}
|
||
else if (type.ToLower() == "double" || type.ToLower() == "float")
|
||
{
|
||
if (string.IsNullOrEmpty(((KryptonTextBox)c).Text))
|
||
return 0;
|
||
return Convert.ToDouble(((KryptonTextBox)c).Text);
|
||
}
|
||
}
|
||
else if (c is KryptonComboBox)
|
||
{
|
||
if (((KryptonComboBox)c).SelectedValue == null) return null;
|
||
|
||
if (type.ToLower() == "string")
|
||
{
|
||
return ((KryptonComboBox)c).SelectedValue.ToString();
|
||
}
|
||
else if (type.ToLower() == "decimal")
|
||
{
|
||
if (string.IsNullOrEmpty((string)((KryptonComboBox)c).SelectedValue)) return 0m;
|
||
|
||
if (!string.IsNullOrEmpty(bindFormat))
|
||
return Decimal.Parse(Convert.ToDecimal(((KryptonComboBox)c).SelectedValue).ToString(bindFormat));
|
||
else
|
||
return Convert.ToDecimal(((KryptonComboBox)c).SelectedValue);
|
||
}
|
||
else if (type.ToLower() == "int" || type.ToLower() == "int32" || type.ToLower() == "int16")
|
||
{
|
||
if (string.IsNullOrEmpty((string)((KryptonComboBox)c).SelectedValue)) return 0;
|
||
|
||
return Convert.ToInt32(Convert.ToDecimal(((KryptonComboBox)c).SelectedValue));
|
||
}
|
||
else if (type.ToLower() == "int64")
|
||
{
|
||
if (string.IsNullOrEmpty((string)((KryptonComboBox)c).SelectedValue)) return 0;
|
||
|
||
return Convert.ToInt64(Convert.ToDecimal(((KryptonComboBox)c).SelectedValue));
|
||
}
|
||
else if (type.ToLower() == "double" || type.ToLower() == "float")
|
||
{
|
||
if (string.IsNullOrEmpty((string)((KryptonComboBox)c).SelectedValue)) return 0;
|
||
|
||
return Convert.ToDouble(((KryptonComboBox)c).SelectedValue);
|
||
}
|
||
}
|
||
else if (c is KryptonCheckBox)
|
||
{
|
||
if (type.ToLower() == "string")
|
||
{
|
||
return ((KryptonCheckBox)c).Checked ? YesNoPolicy.YES : YesNoPolicy.NO;
|
||
}
|
||
else if (type.ToLower() == "decimal")
|
||
{
|
||
return ((KryptonCheckBox)c).Checked ? 1m : 0m;
|
||
}
|
||
else if (type.ToLower() == "bool")
|
||
{
|
||
return ((KryptonCheckBox)c).Checked ? true : false;
|
||
}
|
||
else if (type.ToLower() == "int" || type.ToLower() == "int32" || type.ToLower() == "int16" || type.ToLower() == "int64")
|
||
{
|
||
return ((KryptonCheckBox)c).Checked ? 1 : 0;
|
||
}
|
||
else if (type.ToLower() == "double" || type.ToLower() == "float")
|
||
{
|
||
return ((KryptonCheckBox)c).Checked ? 1d : 0d;
|
||
}
|
||
}
|
||
else if (c is KryptonDateTimePicker)
|
||
{
|
||
if (!((KryptonDateTimePicker)c).Checked) return null;
|
||
|
||
if (string.IsNullOrEmpty(((KryptonDateTimePicker)c).Text)) return null;
|
||
else if (type.ToLower() == "string")
|
||
{
|
||
return ((KryptonDateTimePicker)c).Text.Trim();
|
||
}
|
||
else if (type.ToLower() == "nullable`1" || type.ToLower() == "datetime" || type.ToLower() == "sqldatetime")
|
||
{
|
||
if (type.ToLower() == "datetime" && string.IsNullOrEmpty(((KryptonDateTimePicker)c).Text))
|
||
return DBNull.Value;
|
||
else if (type.ToLower() == "sqldatetime" && string.IsNullOrEmpty(((KryptonDateTimePicker)c).Text))
|
||
return SqlDateTime.Null;
|
||
else
|
||
return ((KryptonDateTimePicker)c).Value;
|
||
}
|
||
}
|
||
else if (c is KryptonMaskedTextBox)
|
||
{
|
||
if (string.IsNullOrEmpty(((KryptonMaskedTextBox)c).Text)) return null;
|
||
else if (type.ToLower() == "string")
|
||
{
|
||
return ((KryptonMaskedTextBox)c).Text.Trim();
|
||
}
|
||
else if (type.ToLower() == "nullable`1" || type.ToLower() == "datetime" || type.ToLower() == "sqldatetime")
|
||
{
|
||
if (type.ToLower() == "datetime" && string.IsNullOrEmpty(((KryptonMaskedTextBox)c).Text))
|
||
return DBNull.Value;
|
||
else if (type.ToLower() == "sqldatetime" && string.IsNullOrEmpty(((KryptonMaskedTextBox)c).Text))
|
||
return SqlDateTime.Null;
|
||
else
|
||
{
|
||
if (!string.IsNullOrEmpty(bindFormat))
|
||
return DateTime.ParseExact(((KryptonMaskedTextBox)c).Text.Trim(), bindFormat, CultureInfo.InvariantCulture, DateTimeStyles.None);
|
||
else
|
||
return DateTime.Parse(((KryptonMaskedTextBox)c).Text.Trim(), CultureInfo.InvariantCulture, DateTimeStyles.None);
|
||
}
|
||
}
|
||
else if (type.ToLower() == "decimal")
|
||
{
|
||
if (!string.IsNullOrEmpty(bindFormat))
|
||
return Decimal.Parse(Convert.ToDecimal(((KryptonMaskedTextBox)c).Text).ToString(bindFormat));
|
||
else
|
||
return Convert.ToDecimal(((KryptonMaskedTextBox)c).Text);
|
||
}
|
||
else if (type.ToLower() == "int" || type.ToLower() == "int32" || type.ToLower() == "int16")
|
||
{
|
||
return Convert.ToInt32(Convert.ToDecimal(((KryptonMaskedTextBox)c).Text));
|
||
}
|
||
else if (type.ToLower() == "int64")
|
||
{
|
||
return Convert.ToInt64(Convert.ToDecimal(((KryptonMaskedTextBox)c).Text));
|
||
}
|
||
else if (type.ToLower() == "double" || type.ToLower() == "float")
|
||
{
|
||
return Convert.ToDouble(((KryptonMaskedTextBox)c).Text);
|
||
}
|
||
}
|
||
else if (c is KryptonCheckedListBox)
|
||
{
|
||
if (((KryptonCheckedListBox)c).GetCheckedItemValue<string>().Count() == 0) return null;
|
||
|
||
return QuotedString.ToDelimiteredList(((KryptonCheckedListBox)c).GetCheckedItemValue<string>());
|
||
}
|
||
else if (c is KryptonListBox)
|
||
{
|
||
if (((KryptonListBox)c).GetAllItemValue<string>().Count() == 0) return null;
|
||
|
||
return QuotedString.ToDelimiteredList(((KryptonListBox)c).GetAllItemValue<string>());
|
||
}
|
||
else if (c is KryptonRadioButton)
|
||
{
|
||
if (type.ToLower() == "string")
|
||
{
|
||
return ((KryptonRadioButton)c).Checked ? "Y" : "N";
|
||
}
|
||
else if (type.ToLower() == "decimal")
|
||
{
|
||
return ((KryptonRadioButton)c).Checked ? 1m : 0m;
|
||
}
|
||
else if (type.ToLower() == "bool")
|
||
{
|
||
return ((KryptonRadioButton)c).Checked ? true : false;
|
||
}
|
||
else if (type.ToLower() == "int" || type.ToLower() == "int32" || type.ToLower() == "int16" || type.ToLower() == "int64")
|
||
{
|
||
return ((KryptonRadioButton)c).Checked ? 1 : 0;
|
||
}
|
||
else if (type.ToLower() == "double" || type.ToLower() == "float")
|
||
{
|
||
return ((KryptonRadioButton)c).Checked ? 1d : 0d;
|
||
}
|
||
}
|
||
|
||
return ((Control)c).Text;
|
||
}
|
||
}
|
||
|
||
public class BindingContextCustomAttribute
|
||
{
|
||
public BindingContextCustomAttribute()
|
||
{
|
||
|
||
}
|
||
|
||
public string BindDataName { get; set; }
|
||
public string BindDisplayName { get; set; }
|
||
|
||
public EnumBindDirection BindDirection { get; set; }
|
||
public string BindFormat { get; set; }
|
||
|
||
public EnumEditModeColor EditModeColor { get; set; }
|
||
|
||
public Operate PermissionMode { get; set; }
|
||
public string PermissionName { get; set; }
|
||
|
||
public string DependentDetailName { get; set; }
|
||
|
||
public List<dynamic> DataSource { get; set; }
|
||
|
||
public DataTable DataTableSource { get; set; }
|
||
public DataTable DeleteDataTableSource { get; set; }
|
||
}
|
||
}
|
||
|