1

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 の定義が見つからないと不平を言っています。フォームの名前を明示的に使用すると、静的フィールドにはオブジェクト参照が必要であると表示されます...それが何を意味するのかよくわかりません。this.sizeComboBox を使用すると、フォームではなく構造体が参照されます。sizeComboBox だけを使用する場合も、オブジェクト参照が必要です。

4

4 に答える 4

0

構造体は、それが含まれているクラスtypeについて知っていますが、そのタイプの特定のインスタンスについては、あなたが言わない限り知りません。たとえば、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 について何も認識してはなりません。

この構造を逆にすることができれば、コードがずっときれいになります。

于 2010-11-30T19:54:07.420 に答える
0

他のフォームが次のようにForm2キャストできるとActiveFormしますForm2:

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
于 2010-11-30T19:54:24.367 に答える
0
    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();
        }
    }

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

于 2010-11-30T19:54:48.293 に答える
0

ActiveFormにキャストする必要がありますForm1

このようなものだと思います(チェックするためにVSを今開いていないでください):

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

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

于 2010-11-30T19:58:44.950 に答える