2009-05-20 71 views
8

我有一個綁定到數據源的組合框。我想根據某些條件動態添加項目到組合框。所以我所做的就是添加選項到一個新的列表,然後改變ComboBox的數據源,像這樣:組合框items.count不符合數據源(C#)

cbo.DataSource = null; 
cbo.DataSource = cbos; 
cbo.DisplayMember = "Title"; 
cbo.ValueMember = "Value"; 

然後,我檢查cbo.Items.Count,到現在也沒有增加 - 這不等於數據源的數量。任何想法我可以在這裏做什麼?注意這是WinForms而不是asp.net。

謝謝

+2

您是否在下拉菜單實際下降之前或之後檢查.Count屬性?我懷疑爲避免重新加載項目集合而進行了一些優化,因此它可能會推遲整個事情,直到您將它放到屏幕上。 – 2009-05-20 13:14:37

+0

這是什麼版本的.NET?在Visual Studio 2008中,編譯爲2.0或3.5會立即生成正確數量的項目。 – 2009-05-20 13:41:28

+1

我在VS2012中遇到了一個動態創建的組合框的問題 – 2013-02-10 05:27:06

回答

6

如果有人在動態添加的組合框上遇到此問題,答案是確保將組合框添加到窗體中容器的控件上。

通過添加「this.Controls.Add(cbo);」在設置數據源之前寫入代碼,問題就消失了。

12

您是否立即檢查計數?有可能ComboBox不會實際更新它的內容,直到有一個操作(如UI刷新),因此在此之前計數將會關閉。

在這種情況下可能發生的情況是,如果在爲ComboBox創建Handle之前更新了DataSource。我在反射器上鑽了一下代碼,看起來在這種情況下項目不會被更新,直到ComboBox被實際創建和渲染。

+1

我在代碼中立即檢查Items.Count屬性,因爲我需要在那時再做一些邏輯。 – Madeleine 2009-05-20 13:17:57

+0

檢查數據源中的項目數量不是更簡單嗎? – scraimer 2009-05-20 13:26:57

+0

問題是我必須設置選定的項目,通常是新的,並且該索引不存在。 – Madeleine 2009-05-20 13:28:10

0

還有一個「DataSourceChanged」 -event ...也許可以幫助

0

只是爲了澄清你打計數()方法 調用數據綁定()方法後

+0

這是一個winforms組合框,沒有數據綁定() – 2009-05-20 13:31:45

5

我發現原因...

我拿出了cbo.Datasource = null行..並在最後添加了一個cbo.Invalidate()。這已經解決了這個問題。

謝謝大家的建議。

+1

找到你自己的解決方案。繼續並接受你自己的答案。 +1 – 2009-05-20 13:37:25

0

此代碼在我的消息框中生成2,你可以試試看,看看它是如何表現的嗎?

您可以將其粘貼到控制檯應用程序中,並添加對System.Windows.FormsSystem.Drawing的引用。

using System; 
using System.Collections.Generic; 
using System.Windows.Forms; 
using System.Drawing; 

namespace SO887803 
{ 
    static class Program 
    { 
     [STAThread] 
     static void Main() 
     { 
      Application.Run(new MainForm()); 
     } 
    } 

    public partial class MainForm : Form 
    { 
     private Button _Button; 
     private ComboBox _ComboBox; 

     public MainForm() 
     { 
      _Button = new Button(); 
      _Button.Text = "Test"; 
      _Button.Location = new Point(8, 8); 
      _Button.Click += _Button_Click; 
      Controls.Add(_Button); 

      _ComboBox = new ComboBox(); 
      _ComboBox.Location = new Point(8, 40); 
      Controls.Add(_ComboBox); 
     } 

     private void _Button_Click(object sender, EventArgs e) 
     { 
      List<Item> items = new List<Item>(); 
      items.Add(new Item("A", "a")); 
      items.Add(new Item("B", "b")); 

      _ComboBox.DataSource = null; 
      _ComboBox.DataSource = items; 
      _ComboBox.DisplayMember = "Title"; 
      _ComboBox.ValueMember = "Value"; 
      MessageBox.Show("count: " + _ComboBox.Items.Count); 
     } 

     public class Item 
     { 
      public String Title { get; set; } 
      public String Value { get; set; } 
      public Item(String title, String value) 
      { 
       Title = title; 
       Value = value; 
      } 
     } 
    } 
} 
0

comboBox1.DataSource = somelist;

int c1 = comboBox1.DataSource.Count; //仍爲零

BindingContext dummy = this.comboBox1.BindingContext; //強制更新NOW!

int c2 = comboBox1.DataSource.Count; //現在它等於somelist.Count

-1

巴薩拉姆,

你可以簡單地通過刷新preformLayout()函數的UI;

示例:

comboBox1。performLayout();

問候 穆赫辛小號

-1

請試試這個:

cbo.Parent = <your panel control>; 
cbo.DataSource = null; 
cbo.DataSource = cbos; cbo.DisplayMember = "Title"; 
cbo.ValueMember = "Value"; 
MessageBox.Show(string.Format("itemcount is {0}", cbo.Items.Count); 

我認爲你的問題薩姆斯像我今天遇到。

0

我有同樣的問題(我與VS 2005工作)。

你需要做的是將數據源設置爲空,清除項目,重新分配數據源,顯示和賦值成員。

例如

cbo.DataSource = null;

cbo.Items.Clear();

cbo.DataSource = cbos;

cbo.DisplayMember =「Title」;

cbo.ValueMember =「Value」;

4
cbo.DataSource = null; 
cbo.DataSource = cbos; 
cbo.DisplayMember = "Title"; 
cbo.ValueMember = "Value"; 

現在設置cbo.SelectedValue,或依靠Items是前跟上時代的,叫

cbo.CreateControl ; 

Items將被重新計算。

的問題是,SelectedValue/SelectedIndex,這是WinForms的特性,只接受根據Items列表是合法的值,但是,一個是隻有在GUI交互,即建立實例化一個「真實」的Windows GUI組合後框,即在獲取組合框的Windows句柄之後。

CreateControl強制創建Windows句柄,無論如何。

0

舊的線程,但我嘗試了一些解決方案,以及暫停/恢復綁定上下文,綁定和重置綁定源,並只是簡單地重新加載窗體。在我的.datasource設置時(我的items.count是空的,就像OP一樣),沒有任何工作可以用新綁定的數據更新我的控件。

然後我意識到我的組合框是在代碼開始時被刪除,然後重新添加(在我的數據綁定後)的tabpage上。綁定事件沒有發生直到頁面被重新添加。

回想起來似乎很明顯,但由於調用的順序以及無法查看事情何時發生變化,在運行時很難檢測到。

0
ComboBox cbNew = new ComboBox(); 
    cbNew.Name = "cbLine" + (i+1); 
    cbNew.Size = cbLine1.Size; 
    cbNew.Location = new Point(cbLine1.Location.X, cbLine1.Location.Y + 26*i); 
    cbNew.Enabled = false; 
    cbNew.DropDownStyle = ComboBoxStyle.DropDownList; 
    cbNew.DataSource = DBLayer.GetTeams(lineName).Tables[0]; 
    cbNew.DisplayMember = "teamdesc"; 
    cbNew.ValueMember = "id"; 
    Console.WriteLine("ComboBox {0}, itemcount={1}", cbNew.Name, cbNew.Items.Count); 
     // The output displays itemcount = 0 for run-time created controls 
     // and >0 for controls created at design-time 
    gbLines.Controls.Add(cbNew); 

TO

ComboBox cbNew = new ComboBox(); 
    cbNew.Name = "cbLine" + (i+1); 
    cbNew.Size = cbLine1.Size; 
    cbNew.Location = new Point(cbLine1.Location.X, cbLine1.Location.Y + 26*i); 
    cbNew.Enabled = false; 
    cbNew.DropDownStyle = ComboBoxStyle.DropDownList; 
    Console.WriteLine("ComboBox {0}, itemcount={1}", cbNew.Name, cbNew.Items.Count); 
     // The output displays itemcount = 0 for run-time created controls 
     // and >0 for controls created at design-time 
    gbLines.Controls.Add(cbNew); 
    cbNew.DataSource = DBLayer.GetTeams(lineName).Tables[0]; 
    cbNew.DisplayMember = "teamdesc"; 
    cbNew.ValueMember = "id"; 

的數據源,在控制已被添加到其容器DisplayMember和ValueMember屬性必須設置。