c# combobox教學 - 組合框:將文本和值添加到項目(無綁定源)





add item (17)


我喜歡fab的答案,但不想為我的情況使用字典,所以我替換了元組列表。

// set up your data
public static List<Tuple<string, string>> List = new List<Tuple<string, string>>
{
  new Tuple<string, string>("Item1", "Item2")
}

// bind to the combo box
comboBox.DataSource = new BindingSource(List, null);
comboBox.ValueMember = "Item1";
comboBox.DisplayMember = "Item2";

//Get selected value
string value = ((Tuple<string, string>)queryList.SelectedItem).Item1;

在C#WinApp中,如何將文本和值都添加到我的ComboBox的項目中? 我做了搜索,通常答案是使用“綁定到源”..但在我的情況下,我沒有在我的程序中準備好綁定源...我該怎麼做這樣的事情:

combo1.Item[1] = "DisplayText";
combo1.Item[1].Value = "useful Value"



您應該使用dynamic像在運行時解析組合框項目。

comboBox.DisplayMember = "Text";
comboBox.ValueMember = "Value";

comboBox.Items.Add(new { Text = "Text", Value = "Value" });

(comboBox.SelectedItem as dynamic).Value



不知道這是否適用於原帖中的情況(不用擔心這是兩年後的事實),但這個例子適用於我:

Hashtable htImageTypes = new Hashtable();
htImageTypes.Add("JPEG", "*.jpg");
htImageTypes.Add("GIF", "*.gif");
htImageTypes.Add("BMP", "*.bmp");

foreach (DictionaryEntry ImageType in htImageTypes)
{
    cmbImageType.Items.Add(ImageType);
}
cmbImageType.DisplayMember = "key";
cmbImageType.ValueMember = "value";

為了讀出你的值,你必須將SelectedItem屬性轉換成一個DictionaryEntry對象,然後你可以評估它的Key和Value屬性。 例如:

DictionaryEntry deImgType = (DictionaryEntry)cmbImageType.SelectedItem;
MessageBox.Show(deImgType.Key + ": " + deImgType.Value);



如果任何人仍然對此感興趣,下面是一個簡單而靈活的類,用於包含文本和任何類型值的組合框項目(與Adam Markowitz的示例非常相似):

public class ComboBoxItem<T>
{
    public string Name;
    public T value = default(T);

    public ComboBoxItem(string Name, T value)
    {
        this.Name = Name;
        this.value = value;
    }

    public override string ToString()
    {
        return Name;
    }
}

使用<T>比將object聲明為object更好,因為使用object您必須跟踪每個項目使用的類型,並將其轉換為代碼以正確使用它。

我已經在我的項目中使用了很長一段時間了。 它非常方便。




您可以使用泛型類型:

public class ComboBoxItem<T>
{
    private string Text { get; set; }
    public T Value { get; set; }

    public override string ToString()
    {
        return Text;
    }

    public ComboBoxItem(string text, T value)
    {
        Text = text;
        Value = value;
    }
}

使用簡單的int型的例子:

private void Fill(ComboBox comboBox)
    {
        comboBox.Items.Clear();
        object[] list =
            {
                new ComboBoxItem<int>("Architekt", 1),
                new ComboBoxItem<int>("Bauträger", 2),
                new ComboBoxItem<int>("Fachbetrieb/Installateur", 3),
                new ComboBoxItem<int>("GC-Haus", 5),
                new ComboBoxItem<int>("Ingenieur-/Planungsbüro", 9),
                new ComboBoxItem<int>("Wowi", 17),
                new ComboBoxItem<int>("Endverbraucher", 19)
            };

        comboBox.Items.AddRange(list);
    }



// Bind combobox to dictionary
Dictionary<string, string>test = new Dictionary<string, string>();
        test.Add("1", "dfdfdf");
        test.Add("2", "dfdfdf");
        test.Add("3", "dfdfdf");
        comboBox1.DataSource = new BindingSource(test, null);
        comboBox1.DisplayMember = "Value";
        comboBox1.ValueMember = "Key";

// Get combobox selection (in handler)
string value = ((KeyValuePair<string, string>)comboBox1.SelectedItem).Value;



我有同樣的問題,我做的是添加一個新的ComboBox ,只有在同一個索引,然後第一個值,然後當我改變主組合,第二個索引在同一時間改變,然後我把第二個組合的值並使用它。

這是代碼:

public Form1()
{
    eventos = cliente.GetEventsTypes(usuario);

    foreach (EventNo no in eventos)
    {
        cboEventos.Items.Add(no.eventno.ToString() + "--" +no.description.ToString());
        cboEventos2.Items.Add(no.eventno.ToString());
    }
}

private void lista_SelectedIndexChanged(object sender, EventArgs e)
{
    lista2.Items.Add(lista.SelectedItem.ToString());
}

private void cboEventos_SelectedIndexChanged(object sender, EventArgs e)
{
    cboEventos2.SelectedIndex = cboEventos.SelectedIndex;
}



這是剛才想到的方法之一:

combo1.Items.Add(new ListItem("Text", "Value"))

而要更改項目的文本或值,可以這樣做:

combo1.Items[0].Text = 'new Text';

combo1.Items[0].Value = 'new Value';

Windows窗體中沒有稱為ListItem的類。 它只存在於ASP.NET ,因此在使用它之前您需要編寫自己的類,就像@Adam Markowitz在他的答案中所做的一樣。

還請檢查這些頁面,它們可能有所幫助:




除了Adam Markowitz的回答,這裡還有一種通用的方式,(相對)簡單地將組合框的ItemSource值設置為enums ,同時向用戶顯示'Description'屬性。 (你會認為每個人都希望這樣做,這將是一個.NET班輪,但它不是,這是我找到的最優雅的方式)。

首先,創建這個簡單的類來將任何Enum值轉換為ComboBox項目:

public class ComboEnumItem {
    public string Text { get; set; }
    public object Value { get; set; }

    public ComboEnumItem(Enum originalEnum)
    {
        this.Value = originalEnum;
        this.Text = this.ToString();
    }

    public string ToString()
    {
        FieldInfo field = Value.GetType().GetField(Value.ToString());
        DescriptionAttribute attribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute;
        return attribute == null ? Value.ToString() : attribute.Description;
    }
}

其次,在OnLoad事件處理程序中,您需要將組合框的源設置為基於Enum類型中的每個EnumComboEnumItems列表。 這可以通過Linq來實現。 然後,只需設置DisplayMemberPath

    void OnLoad(object sender, RoutedEventArgs e)
    {
        comboBoxUserReadable.ItemsSource = Enum.GetValues(typeof(EMyEnum))
                        .Cast<EMyEnum>()
                        .Select(v => new ComboEnumItem(v))
                        .ToList();

        comboBoxUserReadable.DisplayMemberPath = "Text";
        comboBoxUserReadable.SelectedValuePath= "Value";
    }

現在用戶將從用戶友好Descriptions列表中進行選擇,但是他們選擇的是您可以在代碼中使用的enum值。 要訪問用戶在代碼中的選擇, comboBoxUserReadable.SelectedItem將是ComboEnumItemcomboBoxUserReadable.SelectedValue將是EMyEnum




使用DataTable的示例:

DataTable dtblDataSource = new DataTable();
dtblDataSource.Columns.Add("DisplayMember");
dtblDataSource.Columns.Add("ValueMember");
dtblDataSource.Columns.Add("AdditionalInfo");

dtblDataSource.Rows.Add("Item 1", 1, "something useful 1");
dtblDataSource.Rows.Add("Item 2", 2, "something useful 2");
dtblDataSource.Rows.Add("Item 3", 3, "something useful 3");

combo1.Items.Clear();
combo1.DataSource = dtblDataSource;
combo1.DisplayMember = "DisplayMember";
combo1.ValueMember = "ValueMember";

   //Get additional info
   foreach (DataRowView drv in combo1.Items)
   {
         string strAdditionalInfo = drv["AdditionalInfo"].ToString();
   }

   //Get additional info for selected item
    string strAdditionalInfo = (combo1.SelectedItem as DataRowView)["AdditionalInfo"].ToString();

   //Get selected value
   string strSelectedValue = combo1.SelectedValue.ToString();



//set 
comboBox1.DisplayMember = "Value"; 
//to add 
comboBox1.Items.Add(new KeyValuePair("2", "This text is displayed")); 
//to access the 'tag' property 
string tag = ((KeyValuePair< string, string >)comboBox1.SelectedItem).Key; 
MessageBox.Show(tag);



您可以使用Dictionary對象而不是創建自定義類來在Combobox添加文本和值。

Dictionary添加鍵和值:

Dictionary<string, string> comboSource = new Dictionary<string, string>();
comboSource.Add("1", "Sunday");
comboSource.Add("2", "Monday");

將源Dictionary對象綁定到Combobox

comboBox1.DataSource = new BindingSource(comboSource, null);
comboBox1.DisplayMember = "Value";
comboBox1.ValueMember = "Key";

檢索密鑰和值:

string key = ((KeyValuePair<string,string>)comboBox1.SelectedItem).Key;
string value = ((KeyValuePair<string,string>)comboBox1.SelectedItem).Value;

完整源代碼:組合框文本和值




您可以使用此代碼combox添加項目與文本及其值

  private void ComboBox_SelectionChanged_1(object sender, SelectionChangedEventArgs e)
        {
           
            combox.Items.Insert(0, "Copenhagen");
            combox.Items.Insert(1, "Tokyo");
            combox.Items.Insert(2, "Japan");
            combox.Items.Insert(0, "India");
            
           
        }

用文本和值插入一些項目到combox中。 這裡是它的用於combox的xaml代碼




您必須創建自己的類類型並重寫ToString()方法以返回所需的文本。 以下是您可以使用的一個類的簡單示例:

public class ComboboxItem
{
    public string Text { get; set; }
    public object Value { get; set; }

    public override string ToString()
    {
        return Text;
    }
}

以下是其用法的一個簡單示例:

private void Test()
{
    ComboboxItem item = new ComboboxItem();
    item.Text = "Item text1";
    item.Value = 12;

    comboBox1.Items.Add(item);

    comboBox1.SelectedIndex = 0;

    MessageBox.Show((comboBox1.SelectedItem as ComboboxItem).Value.ToString());
}



類創作:

namespace WindowsFormsApplication1
{
    class select
    {
        public string Text { get; set; }
        public string Value { get; set; }
    }
}

Form1代碼:

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            List<select> sl = new List<select>();
            sl.Add(new select() { Text = "", Value = "" });
            sl.Add(new select() { Text = "AAA", Value = "aa" });
            sl.Add(new select() { Text = "BBB", Value = "bb" });
            comboBox1.DataSource = sl;
            comboBox1.DisplayMember = "Text";
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {

            select sl1 = comboBox1.SelectedItem as select;
            t1.Text = Convert.ToString(sl1.Value);

        }

    }
}



你可以使用這樣的匿名類:

comboBox.DisplayMember = "Text";
comboBox.ValueMember = "Value";

comboBox.Items.Add(new { Text = "report A", Value = "reportA" });
comboBox.Items.Add(new { Text = "report B", Value = "reportB" });
comboBox.Items.Add(new { Text = "report C", Value = "reportC" });
comboBox.Items.Add(new { Text = "report D", Value = "reportD" });
comboBox.Items.Add(new { Text = "report E", Value = "reportE" });

更新:雖然上面的代碼將正確顯示在組合框中,但您將無法使用ComboBox SelectedValueSelectedText屬性。 為了能夠使用這些,請按如下方式綁定組合框:

comboBox.DisplayMember = "Text";
comboBox.ValueMember = "Value";

var items = new[] { 
    new { Text = "report A", Value = "reportA" }, 
    new { Text = "report B", Value = "reportB" }, 
    new { Text = "report C", Value = "reportC" },
    new { Text = "report D", Value = "reportD" },
    new { Text = "report E", Value = "reportE" }
};

comboBox.DataSource = items;



這是您在PowerShell腳本cmdlet中處理Path輸入的方法:

function My-Cmdlet {
    [CmdletBinding(SupportsShouldProcess, ConfirmImpact='Medium')]
    Param(
        # The path to the location of a file. You can also pipe a path to My-Cmdlet.
        [Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)]
        [string[]] $Path
    )

    Begin {
        ...
    }

    Process {
        # ignore empty values
        # resolve the path
        # Convert it to remove provider path
        foreach($curPath in ($Path | Where-Object {$_} | Resolve-Path | Convert-Path)) {
            # test wether the input is a file
            if(Test-Path $curPath -PathType Leaf) {
                # now we have a valid path

                # confirm
                if ($PsCmdLet.ShouldProcess($curPath)) {
                    # for example
                    Write-Host $curPath
                }
            }
        }
    }

    End {
        ...
    }
}

您可以通過以下方式調用此方法:

有直接路徑:

My-Cmdlet .

使用通配符字符串:

My-Cmdlet *.txt

使用實際文件:

My-Cmdlet .\PowerShell_transcript.20130714003415.txt

使用變量中的一組文件:

$x = Get-ChildItem *.txt
My-Cmdlet -Path $x

或僅使用名稱:

My-Cmdlet -Path $x.Name

或者通過管道來設置文件集:

$x | My-Cmdlet




c# winforms combobox