0

私は立ち往生していて、私を助けるためにサイト上で何も見つけることができませんでした。

私が持っているもの:

Visual Studio 2010を使用してC#で記述されたWinFormsアプリがあります。約10個のデータフィールドとプロパティを使用してカスタムクラスを作成しました。私のメインフォームでは、各オブジェクトのハウジングのリスト<>を宣言しました。フォームレベルで宣言されます。主にテキストボックスと要素を使用したデータ入力用のカスタムフォームを作成しました(MessageBox/は機能しないため)。また、1つあります。イベントハンドラーでスタック-フォームが読み込まれたときに入力したい。Interaction.InputBoxDateTimeComboBoxCustomdialog_Load

問題:

ComboBoxデータを入力するためにフォームが読み込まれたときに、アイテムをフィードする必要があります。List<>メインフォームのから、特定のプロパティからフィードする必要があります。それをと呼びましょうClientName。に50個のクライアントがリストされている場合はList<>、それらの名前プロパティをコンボボックスに入力しますCollection[]

リクエスト:

ComboBox誰かが、できればデータを複製せずに、同じフォームではないaを与える方法についてアドバイスできますかList<>?私は他のほとんどのことを行うことができ、ロジックフローはすべて正しいです。同じフォームで、通常の方法でコレクションにアイテムを追加する方法を知っています。

編集:

必要に応じて、メインフォームでクライアント名用に別の配列を作成できます。しかし、それはメインフォームにある必要があります。したがって、コンボボックスは、別の形式の配列から入力する必要があります。

編集2:

私はまだ大学1年生です。まだ実行DataBindingしていませんが、達成したいことを実行するためのより良い方法があることを私は知っています。私はまだツールを頭の中に持っていません。私はクラスのずっと前に働きます。すべての助けをありがとう、非常に迅速に!挑戦し続けます!

4

3 に答える 3

1

2番目のフォームのインスタンスを作成するときは、コンストラクターにリストへの参照を渡し、それを2番目のフォーム内のフォームレベル変数に格納します。次に、それを使用して、そのフォームのロードイベントでコンボボックスを初期化します

あなたのメインフォームで

List<Customer> myCustomerList;

.....
using(Customdialog f = new CustomDialog(myCustomerList))
{
    if(DialogResult.OK == f.ShowDialog())
    {
        ..... 
    }
}

CustomDialogクラスで

public class CustomDialog
{
    List<Customer> _customerList;

    public CustomDialog(List<Customer> customers)
    {
        InitializeComponent();
        _customerList = customers;
    }

    private void CustomDialog_Load(object sender, EventArgs e)
    {
         comboBox1.DataSource = _customerList; 
         comboBox1.ValueMember = "Id";  // Supposing the Customer object contains ID property
         comboBox1.DisplayMember = "ClientName";   // The property shown on the combobox items
    }
}
于 2012-08-06T17:52:56.037 に答える
1
class MyDialog : Form
{
    public IEnumerable<Whatever> Items
    {
        get { return _items; }
        set 
        { 
            _items = value; 
            someComboBox.Items = value; 
        }
    }

    public MyDialog(IEnumerable<Whatever> items) 
    { 
        InitializeComponent();
        Items = items;
    }
}

これで、コンストラクターを介して、または後で個別にそれらを渡すことができます。

于 2012-08-06T17:54:17.347 に答える
0

Winformsルートを強制的に下がる場合は、:(しかし、データバインディング(およびデータバインディング)を渡すためのアドバイスが必要なようです。

理想的には、データをカスタムフォームに渡す必要があります(メインフォームとポップアップ/別のフォームが開いていると思います)。

これを行う1つの方法は、2番目のフォームにそのタイプのプロパティを作成し、フォームList<>を開く前にそれを割り当てることです...例:

form2.csで

// an auto property will work well here
public List<YourClass> YourClassList { get; set;}

次に、form1.csで

// When the user opens the second form
Form2 frm2 = new Form2();
frm2.YourClassList = yourClassListFromThisForm;
frm2.ShowDialog(); // etc

ボックスへの入力やデータバインディングの使用にも問題がありますか?

正直なところ、これについてあまり作業を行っていない場合は、WPFへの移行を真剣に検討します。あらゆる点ではるかに優れています。

于 2012-08-06T17:54:45.287 に答える