0

汎用ルックアップフォームオープナーとして新しいユーザーコントロールを作成しようとしています。

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");
            }
        }   
    }
}
4

1 に答える 1

0

このようなもの:

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");

Form2クラスは次のとおりです。

 namespace StackOverflow
    {
        public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
            }

            public string TTT { get { return "Ololo"; } }
        }
    }

そして結果は次のとおりです。

ここに画像の説明を入力してください

于 2013-03-24T21:27:09.217 に答える