9

私は Windows アプリケーションを作成しており、Listbox コントロールを使用しています。Visual Studio C# 2008 Express Edition で開発しています。

このようなデータオブジェクトがあります

public class RootObject
{
   public List<SubObject> MySubObjects{ get; set;}
}

フォームに ListBox があり、明らかに RootObject を保持する "MyRootObject" プロパティもあります。コントロールが初期化されると、次のように設定します。

_listBox.DataSource = MyRootObject.MySubObjects;

ここで、フォームがロードされたら、デバッグして、DataSource が正しく設定されていることを確認します。しかし、何も表示されません。SubObject の ToString() メソッドをオーバーライドしましたが、呼び出されていません。_listBox.DisplayMember を SubObject のプロパティに設定して、そこに問題があるかどうかを確認しようとしましたが、それでも何もありませんでした。DataSource を設定した後に _listBox.Update() と _listBox.Refresh() を呼び出してみましたが、まだ愛されていません。DataSource にはすべてのデータがあります...表示を拒否しているだけです。

そのため、デバッグ中にWTFについて疑問に思ったので、やることにしました

_listBox.DataSource = new List<SubObject>{ new SubObject(), new SubObject() };

案の定、これは機能し、リストボックスに 2 つのものがリストされています。

そこで、非常に興味深いことに、次のように、オブジェクトのリストをコピーしてリストボックスに入れてみることにしました。

_listBox.DataSource = MyRootObject.MySubObjects.ToArray();

これはうまくいきます!そして、それは今のところ私の問題の回避策です...しかし、非常に厄介なものです。_listBox.DataSource = MyRootObject.MySubObjects; を設定するだけでなく、基本的にこのようなオブジェクトのリストをコピーして機能させる必要がある理由を誰かが知っていますか? ? 繰り返しますが、DataSource は、設定後にすべての適切なデータを保持しています... データがコピーされたときは実際に表示され、コピーされていないときは表示されません。

4

8 に答える 8

5
((CurrencyManager)_listBox.BindingContext[_listBox.DataSource]).Refresh();

Sux0r知っていますが、これは機能します。(元々ここで答えが見つかりました)

于 2009-05-20T00:51:42.400 に答える
1

これまでのところ、コレクションをに設定したいときはいつでも

[ComboBox,ListBox].DataSource

DisplayMemberとValueMemberを設定する必要があります。DisplayMemberとValueMemberには、リストボックス/コンボボックスに割り当てられているコレクション内のクラスのプロパティ名が入力されます。元。

//Populate the data
RootObject root = new RootObject();
root.MySubObjects.Add(new SubObject("1", "data 1"));
root.MySubObjects.Add(new SubObject("2", "data 2"));

//Assign data to the data source
_listBox.DisplayMember = "DisplayProperty";
_listBox.ValueMember = "ValueProperty";
_listBox.DataSource = root.MySubObjects;

root.MySubObjectsはSubObjectのリストを返します。SubObjectには、DisplayPropertyおよびValuePropertyというプロパティが必要です。

public class RootObject
{
     public List<SubObject> MySubObjects { get; set; }
}

public class SubObject
{
     public string ValueProperty { get; set; }
     public string DisplayProperty { get; set; }
}
于 2009-03-31T08:14:41.617 に答える
0

BindingSource( http://msdn.microsoft.com/en-us/library/system.windows.forms.bindingsource.aspx)を試して使用することができます

リストボックスとコレクションの間。Bindingsourcesは多くのものを処理し、リストを更新するときに役立つSuspend/ResumeBindingプロパティも含みます

データバインディングはwinformsよりもはるかに優れているため、wpfを試すこともできますが、あなたの場合は不可能かもしれません。

于 2009-03-27T01:39:48.700 に答える
0

リストボックスのデータソースに _listBox.DataSource.bind() のようなものを割り当てた後、Bind メソッドを呼び出す必要があると思います。リストボックスが消えます。

于 2009-03-24T07:34:17.200 に答える
0

_listbox.DataBind(); を呼び出す必要があると思います。データソースを割り当てた後。ただし、これまでプロパティをデータソースとして使用したことはなく、メソッドしか使用したことがありません。プロパティをメソッドに変更して、それが問題かどうかを確認しましたか?

于 2009-03-28T16:50:58.593 に答える
0

私はこのような問題に対して特別なルールを持っており、それを丸一日かけて無駄にする前に、常に覚えておくようにしています (信じてください、私は何日も叩いてきたのです!)。ルールは次のとおりです。システムの動作が本当に奇妙な場合、根本的な原因は非常にばかげているに違いありません。知的なプログラマーとして、私たちは問題を説明するためにフレームワーク コードの難解な原因やバグを探す傾向があります。答えは、私たちが急いでいて、まだ気付いていない不注意な間違いを犯したということです。

シャーロック・ホームズの言葉を借りれば、「不可能を取り除いたとき、どんなにありそうもないことであっても、残ったものが真実でなければならない」. この場合、ありそうもない真実は、MyRoot オブジェクトの MySubObjects プロパティが null であることです。

于 2009-04-05T05:57:10.810 に答える