ネストされた構造体のトストリング方法内からフォームコントロールにアクセスする方法

StackOverflow https://stackoverflow.com/questions/4317813

  •  29-09-2019
  •  | 
  •  

質問

C#で小さなWindowsフォームアプリケーションを構築しています。フォームコード内で、同じフォームのコンボボックス内のアイテムから出力の一部を構築する必要があるToStringメソッドを使用して公開構造を定義します。これは難しいはずではないように聞こえません

public partial class Form1 : Form
{
 public struct OrderLineItem
    {
     string someString;
     int index;
     string ToString()
        {return someString + ActiveForm.sizeComboBox.Items[index].ToString();}  
    }
}

SizeComboBoxの定義が見つからないと不満を述べています。フォームの名前を明示的に使用すると、静的フィールドにオブジェクト参照が必要であると表示されます...それが何を意味するのかよくわかりません。 sizecomboboxを使用すると、フォームではなく構造体を指します。 SizeComboBoxのみを使用すると、オブジェクト参照が必要です。

役に立ちましたか?

解決

構造体は、その含有クラスを知っています タイプ, 、しかし、あなたがそれを言わない限り、それはそのタイプの特定のインスタンスについては知りません。たとえば、Form1オブジェクトを取得するコンストラクターを作成でき、メンバー変数にそのフォームへの参照を保存できます。

public partial class Form1 : Form 
{ 
 public struct OrderLineItem 
    { 
     string someString; 
     int index; 
     Form1 parentForm;

     internal OrderLineItem(Form1 parentForm)
     {
         this = new OrderLineItem();
         this.parentForm = parentForm;
     }

     string ToString() 
     {
         if (parentForm == null)
             return string.Empty;
         else
             return someString + parentForm.sizeComboBox.Items[index].ToString();
     }   
    } 
} 

とはいえ、これは非常に疑わしいデザインです。

このアプリケーションの階層型構造は、逆さまに見えます。 Order-Line-ITEMオブジェクトは、ユーザーインターフェイスレイヤーよりも低いレベルで存在する必要があります。 UIは、ビジネスオブジェクト(注文、注文項目など)を表示することがありますが、ビジネスオブジェクトはUIについて何も知らないはずです。

この構造を反転させると、コードがはるかにきれいになります。

他のヒント

他のフォームがあると仮定します Form2 キャストできます ActiveFormForm2:

var form2 = ActiveForm as Form2;
if (form2 != null) // form2 == null if ActiveForm is not of type Form2.
{
    form2.sizeComboBox...
}

編集:
2つのメモ。

  1. ActiveFormを取得する代わりに、Form2が作成された場合、Form1のメンバー変数でForm2をより適しています。
  2. Form2のプロパティの背後にあるコンボボックス値の取得をカプセル化する必要があります。 SelectedFooValue.
    public partial class Form1 : Form
{
    internal static Form1 ActiveForm { get; set; }

    public Form1()
    {
        InitializeComponent();
        ActiveForm = this;
    }

    public struct OrderLineItem
    {
        public override string ToString()
        {
            return ActiveForm.sizeComboBox.Items[index].ToString();
        }
    }

ただし、これは正しいアプローチではないことに注意してください。たぶんあなたはあなたが達成しようとしていることを投稿することができ、私たちは助けることができますか?

キャストする必要があります ActiveFormForm1.

このようなことは、私が思う(今すぐチェックするために開いていることはない):

return someString + ((Form1)ActiveForm).sizeComboBox.Items[index].ToString();

ただし、これは一般的に物事を進める良い方法ではありません。クラスでメソッドを作成し、構造体がコントロールにディレクトリを参照してはなりません。代わりにデータを構造体に送信するか、フォーム上にメソッドを作成して、何らかの方法でデータを返すようにしてください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top