Winforms 通用表格开启器
我正在尝试创建一个新的用户控件作为通用的查找表单开启器Winforms 通用表格开启器,winforms,generics,user-controls,Winforms,Generics,User Controls,我正在尝试创建一个新的用户控件作为通用的查找表单开启器 lkpControl.FormToOpen="FrmProductList"; lkpControl.ReturnValueVariableName="ProductCode"; lkpControl.ShowThatForm(); if dialog result is OK: lkpControl.txtValue=lkpControl.GetSelectedValue(); 此控件将从其名称打开预配置(或在设计时指定)表单,并将打开
lkpControl.FormToOpen="FrmProductList";
lkpControl.ReturnValueVariableName="ProductCode";
lkpControl.ShowThatForm();
if dialog result is OK:
lkpControl.txtValue=lkpControl.GetSelectedValue();
此控件将从其名称打开预配置(或在设计时指定)表单,并将打开表单中的选定项返回其文本框。就像从文件夹浏览器对话框中获取路径一样
只是打开表单中选定项的通用表单开启器和值获取器
如果您能告诉我任何解决方案或路径,我将不胜感激
提前谢谢
更新:
我已经解决了这个问题:
public partial class LookupButton : UserControl
{
[Description("Type of the Form To Open: typeof(LookupButtonTest.Form2)")]
[Category("Custom")]
public Type FormToOpen { get; set; }
[Description("Name Of the public property to get return value from opened form.")]
[Category("Custom")]
public string PropertyToGet { get; set; }
public LookupButton()
{
InitializeComponent();
}
private void btnOpenForm_Click(object sender, EventArgs e)
{
if (FormToOpen == null)
{
throw new ArgumentNullException("FormToOpen");
}
if (PropertyToGet.Length <= 0)
{
throw new ArgumentNullException("PropertyToGet");
}
Form objForm = (Form)Activator.CreateInstance(FormToOpen);
if (objForm.ShowDialog() == DialogResult.OK)
{
bool propertyFound = false;
PropertyInfo[] props = objForm.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public);
foreach (PropertyInfo p in props)
{
if (p.Name == PropertyToGet)
{
txtReturnVal.Text = p.GetValue(objForm, null).ToString();
propertyFound = true;
}
}
if (!propertyFound)
{
throw new ArgumentNullException("PropertyToGet");
}
}
}
}
public分部类LookupButton:UserControl
{
[说明(“要打开的表单类型:typeof(LookupButtonTest.Form2)”)]
[类别(“海关”)]
公共类型FormToOpen{get;set;}
[说明(“从打开的表单中获取返回值的公共属性的名称”。)]
[类别(“海关”)]
公共字符串PropertyToGet{get;set;}
公共查找按钮()
{
初始化组件();
}
私有void btnOpenForm_单击(对象发送方,事件参数e)
{
如果(FormToOpen==null)
{
抛出新ArgumentNullException(“FormToOpen”);
}
如果(PropertyToGet.Length类似于以下内容:
public static class ShowFormAs
{
public static T1 ShowForm<T1>(string fullTypeName, string propertyName)
where T1: class
{
return string.IsNullOrEmpty(fullTypeName)
? default(T1) :
ShowForm<T1>(System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(fullTypeName) as Form, propertyName);
}
public static T1 ShowForm<T, T1>(string propertyName)
where T: Form, new ()
where T1: class
{
return ShowForm<T1>(new T(), propertyName);
}
private static T1 ShowForm<T1>(Form form, string propertyName)
where T1: class
{
if (form == null)
{
return default(T1);
}
if (form.ShowDialog() == DialogResult.OK)
{
var property = form.GetType().GetProperties().FirstOrDefault(o => string.CompareOrdinal(o.Name, propertyName) == 0);
if (property == null)
{
return default(T1);
}
return property.GetValue(form, null) as T1;
}
return default(T1);
}
}
结果是:
var x = ShowFormAs.ShowForm<Form2, string>("TTT");
var z = ShowFormAs.ShowForm<string>("StackOverflow.Form2", "TTT");
namespace StackOverflow
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
public string TTT { get { return "Ololo"; } }
}
}