Как добавить новые элементы в выпадающий список, который связан с сущностями? - PullRequest
4 голосов
/ 03 октября 2011

Класс проектирования, который генерируется C #:

    // 
    // usepurposeComboBox
    // 
    this.usepurposeComboBox.DataSource = this.usepurposeBindingSource;
    this.usepurposeComboBox.DisplayMember = "Name";
    this.usepurposeComboBox.FormattingEnabled = true;
    this.usepurposeComboBox.Location = new System.Drawing.Point(277, 53);
    this.usepurposeComboBox.Name = "usepurposeComboBox";
    this.usepurposeComboBox.Size = new System.Drawing.Size(218, 21);
    this.usepurposeComboBox.TabIndex = 4;
    this.usepurposeComboBox.ValueMember = "id";
    // 
    // usepurposeBindingSource
    // 
    this.usepurposeBindingSource.DataSource = typeof(mydatabaseEntities.usepurpose);

Затем я связал BindingSource (usepurposeBindingSource) с сущностями:

usepurposeBindingSource.DataSource = mydatabaseEntities.usepurposes;

И я не могу добавить новую строку в usepurposeComboBox, потому что она была связана. Есть ли обходной путь?

Ответы [ 5 ]

1 голос
/ 22 августа 2012

Самый короткий способ - добавить новую строку в вашу таблицу данных, а затем привязать к ней свой comboBox примерно так:

Company comps = new Company ();

        //pupulate dataTable with data
        DataTable DT = comps.getCompaniesList();

        //create a new row
        DataRow DR = DT.NewRow();
        DR["c_ID"] = 0;
        DR["name"] = "Add new Company";
        DR["country"] = "IR";

        //add new row to data table
        DT.Rows.Add(DR);

        //Binding DataTable to cxbxCompany
        cxbxCompany.DataSource = DT;
        cxbxCompany.DisplayMember = "name";
        cxbxCompany.ValueMember = "c_ID";
0 голосов
/ 02 сентября 2013

Проверить эту ссылку: http://forums.asp.net/t/1695728.aspx/1?

В ASP вы можете добавить это, чтобы вставить пустую строку:

    <asp:DropDownList ID="CustomerDropDownList" runat="server"
    DataSourceID="CustomerEntityDataSource" DataTextField="CustomerId"
    DataValueField="CustomerId" AppendDataBoundItems="true">
    <asp:ListItem Text="Select All Customers" Value="" />
    </asp:DropDownList>

Или в коде позади:

    DropDownList1.AppendDataBoundItems = true;
    DropDownList1.Items.Add(new ListItem("Select All Customers", "-1"));
0 голосов
/ 03 октября 2011

Самый простой способ сделать это - обернуть ваш BindingSource каким-то видом «ViewModel».Новый класс возвратит «полный» список элементов - как предоставленных из исходного источника привязки, так и эти «дополнительные» элементы.

Затем вы можете привязать новую оболочку к вашему списку.

Я написал статью об этом некоторое время назад ... Это не моя лучшая работа, и, возможно, она немного устарела, но она должна вас туда привести.

0 голосов
/ 04 октября 2011

Я решил это самостоятельно.Я создал новый несвязанный комбинированный список, а затем связал его с таблицей данных.Не уверен, что это лучший способ, но он работает для меня.Спасибо за все ваши предложения.:)

private void FillCombobox()
        {
            using (mydatabaseEntities mydatabaseEntities = new mydatabaseEntities())
            {
                List<usepurpose> usepurposes = mydatabaseEntities.usepurposes.ToList();              
                DataTable dt = new DataTable();
                dt.Columns.Add("id");
                dt.Columns.Add("Name");
                dt.Rows.Add(-1, "test row");
                foreach (usepurpose usepurpose in usepurposes)
                {
                    dt.Rows.Add(usepurpose.id, usepurpose.Name);
                }
                usepurposeComboBox.ValueMember = dt.Columns[0].ColumnName;
                usepurposeComboBox.DisplayMember = dt.Columns[1].ColumnName;
                usepurposeComboBox.DataSource = dt;
            }
        }
0 голосов
/ 03 октября 2011

Я предполагаю, что вы хотите добавить, например, первый элемент, который иногда называется «Выбрать один», как если бы вы хотели передавать данные, вы просто должны увидеть, откуда поступают данные, и добавить больше элементов в эту «таблицу».

this.usepurposeBindingSource - это объект ... почему бы не добавить в него, пока он не свяжется?

, если это List<T>, это будет хорошо

this.usepurposeBindingSource.Insert(0, new T() {
    Name = "Choose one",
    Id = ""
});

Тогда Bind() it ...

Не забудьте проверить, так как это строка и она не будет тем объектом, который вы хотите


Это работает:

List<MyObject> usepurposeBindingSource { get; set; }

private void FillUpData()
{
    // Simulating an External Data
    if (usepurposeBindingSource == null || usepurposeBindingSource.Count == 0)
    {
        this.usepurposeBindingSource = new List<MyObject>();
        this.usepurposeBindingSource.Add(new MyObject() { Name = "A", ID = 1 });
        this.usepurposeBindingSource.Add(new MyObject() { Name = "B", ID = 2 });
        this.usepurposeBindingSource.Add(new MyObject() { Name = "C", ID = 3 });
    }
}

private void FillUpCombo()
{
    FillUpData();

    // what you have from design
    // comment out the first line
    //this.usepurposeComboBox.DataSource = this.usepurposeBindingSource;
    this.usepurposeComboBox.DisplayMember = "Name";
    this.usepurposeComboBox.FormattingEnabled = true;
    this.usepurposeComboBox.Location = new System.Drawing.Point(277, 53);
    this.usepurposeComboBox.Name = "usepurposeComboBox";
    this.usepurposeComboBox.Size = new System.Drawing.Size(218, 21);
    this.usepurposeComboBox.TabIndex = 4;
    this.usepurposeComboBox.ValueMember = "id";

    // to do in code:

    this.usepurposeBindingSource.Insert(0, new MyObject() { Name = "Choose One", ID = 0 });

    // bind the data source
    this.usepurposeComboBox.DataSource = this.usepurposeBindingSource;

}

Хитрость заключается в том, чтобы закомментировать строку DataSource и сделать это в вашем коде, вставив еще один элемент в ваш объект, который принадлежит вашей модели

//this.usepurposeComboBox.DataSource = this.usepurposeBindingSource;

...