6

List()以下は、 aをComboBoxコントロールにバインドしている私のコードです。データソースに割り当てられているInsert() methodとおりに、CombBoxコントロールにいくつかの項目を追加しようとしました。not allowedしたがって、オブジェクトを返すcmbColour.DataSourceからデータソースを新しい変数(たとえば、var colours2)に戻すにはどうすればよいですか。ありがとう!

var colours= new Dictionary<string, string>
            {
              {"1x","Green"},
              {"2x","Red"},
              {"3y","Blue"},
              {"4y","Black"}
            }.ToList();

cmbColour.ValueMember = "Key";
cmbColour.DisplayMember = "Value";
cmbColour.DataSource = colours;

var colours2 = //how can I get the DataSource back 
4

5 に答える 5

7

次のコードは、コンボボックスにバインドしたものと同じデータを含む新しい辞書を返します。

var list = (List<KeyValuePair<String, String>>)cmbColor.DataSource;

var dictionary = list.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);

プロパティDataSourceは、割り当てたものと同じインスタンスを返しますが、型指定されているためObject、メンバーにアクセスする前に、実際の型にキャストして戻す必要があります。

でも、元の辞書だけを残してみませんか?また、データソースにバインドされたリストを変更することは確実にサポートされています。これがデータバインディングの要点です。

私の答えはあなたの実際の問題を実際に解決するのではなく、あなたがあなたの問題が何であると思うかだけを解決すると思います。たぶん、あなたはあなたが達成しようとしていることについていくつかの追加情報を与えることができ、私または他の誰かがあなたの根本的な問題についてあなたを助けることができるでしょう。

アップデート

これはあなたのシナリオでうまくいくはずです-私はユーザーの例に固執します。

public class User
{
    public String Id { get; set; }

    public String Name { get; set; }
}

そして、フォームのコード。

public partial class MainForm : Form
{
    private readonly BindingList<User> recentlyAddedUsers = new BindingList<User>();

    private void MainFormLoad(Object sender, EventArgs e)
    {
        this.comboBoxRecentlyAddedUsers.DataSource = this.recentlyAddedUsers;

        this.comboBoxRecentlyAddedUsers.ValueMember = "Id";
        this.comboBoxRecentlyAddedUsers.DisplayMember = "Name";

        var recentlyAddedUsersFromService = this.GetRecentlyAddedUsers();

        foreach (var user in recentlyAddedUsersFromService)
        {
            this.recentlyAddedUsers.Add(user);
        }
    }

    private void ButtonAddNewUserClick(Object sender, EventArgs e)
    {
        var newUser = new User();

        newUser.Id = this.textBoxUserId.Text;
        newUser.Name = this.textBoxUserName.Text;

        this.SaveNewUser(newUser);

        this.recentlyAddedUsers.RemoveAt(0);
        this.recentlyAddedUsers.Insert(newUser);
    }

    private List<User> GetRecentlyAddedUsers()
    {
        // Get a list of recently added users from the database.
    }

    private void SaveNewUser(User user)
    {
        // Save the new user to the database.
    }
}

-の使用法に注意してくださいBindingList<T>。これにより、リストへの変更がコンボボックスに通知されます。単純なList<T>ものでも機能しますが、データバインディングを更新するようにコンボボックスに明示的に指示する必要があります。

于 2012-12-19T19:34:44.550 に答える
1

DataSourceとして入力されているため、そこobjectからデータを抽出するためのクリーンな方法はありません。データソースの基になるタイプがわかっている場合(つまり、データソースを別の場所に設定して、そのタイプがわかっている場合)、データソースをキャストしてコレクションにアイテムを追加できます。

オブジェクトは元のオブジェクトのコピーではなく参照になることに注意してください。つまり、最初にデータソースをディクショナリに設定してから、それを抽出して、同じディクショナリにアイテムを追加するアイテムを追加しようとします。

だからあなたの場合:

 var colours2 = cmbColour.DataSource as List<KeyValuePair<string, string>>;
 // can add items to colours2 here (but it is the same instance as colours)
于 2012-12-19T19:34:10.597 に答える
1
var coloursList = cmbColour.DataSource as List<KeyValuePair<string, string>>;
var colours2 = coloursList.ToDictionary(x => x.Key, x => x.Value);
于 2012-12-19T19:34:15.610 に答える
0

次のキャストを使用して、データを取り戻すことができます。

namespace WebApplication2
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            var colours = new Dictionary<string, string>
            {
                {"1x", "Green"},
                {"2x", "Red"},
                {"3y", "Blue"},
                {"4y", "Black"}
            }.ToList();

            cmbColour.DataSource = colours;

            List<KeyValuePair<string, string>> l1 = new List<KeyValuePair<string, string>>();

            l1 = (List<KeyValuePair<string, string>>)cmbColour.DataSource;
        }
    }
}
于 2012-12-19T20:17:27.603 に答える
0
List<KeyValuePair<String, String>> c = new List<KeyValuePair<string, string>>
        {
            new KeyValuePair<string, string>("m", "n"),
            new KeyValuePair<string, string>("k", "c")
        };

comboBox1.DataSource = c;

c.Add(new KeyValuePair<string, string>("new","new value"));

また

var list = (List<KeyValuePair<String, String>>)comboBox1.DataSource;
list.Add(new KeyValuePair<string, string>("new", "new value"));
于 2014-01-21T13:19:12.223 に答える