ฉันจะตั้งค่ารายการที่เลือกใน comboBox ให้ตรงกับสตริงของฉันโดยใช้ C # ได้อย่างไร


197

ฉันมีสตริง "test1" และ comboBox ฉันมีtest1, และtest2 test3ฉันจะตั้งค่ารายการที่เลือกเป็น "test1" ได้อย่างไร นั่นคือฉันจะจับคู่สตริงของฉันกับหนึ่งในรายการ comboBox ได้อย่างไร

ฉันกำลังคิดถึงบรรทัดด้านล่าง แต่มันใช้งานไม่ได้

comboBox1.SelectedText = "test1"; 

มันใช้งานไม่ได้ จะเกิดอะไรขึ้นเมื่อรหัสบรรทัดนี้ทำงาน
Kate Gregory

@KateGregory เพียงแค่เชื่อมสตริง "test1" เข้ากับข้อความที่มีอยู่
solujic

หากคุณมีวิธีการรู้ค่าของรายการคุณสามารถใช้: comboBox1.SelectedValue = Value_of_your_string;
CésarLeón

SelectedTextเปลี่ยนข้อความ "ที่เลือก" เป็น test1 หากไม่มี "การเลือก" (ข้อความที่ทำเครื่องหมายไว้) ข้อความจะถูกแทรกในตำแหน่งของเครื่องหมายรูปหมวก
AaA

คำตอบ:


278

สิ่งนี้ควรทำเคล็ดลับ:

Combox1.SelectedIndex = Combox1.FindStringExact("test1")

ดูเหมือนคำตอบที่ดีกว่าสำหรับฉันเพราะคุณมีค่าตอบแทนคุณสามารถบันทึกชั่วคราวในตัวแปรและใช้เพื่อทดสอบว่าคุณได้พบคุณค่าที่คุณกำลังมองหา
Áxel Costas Pena

จะเกิดอะไรขึ้นถ้ามีค่า "test1" มากกว่าหนึ่งค่าใน combox1
thoitbk

@thoitbk - ตาม MSDN ที่msdn.microsoft.com/en-us/library/…วิธีการFindStringExact() "ค้นหารายการแรกในกล่องคำสั่งผสมที่ตรงกับสตริงที่ระบุ"
สไตล์พากย์

207

คุณลองคุณสมบัติข้อความหรือไม่ มันใช้งานได้สำหรับฉัน

ComboBox1.Text = "test1";

คุณสมบัติ SelectedText สำหรับส่วนที่เลือกของข้อความที่แก้ไขได้ในส่วนกล่องข้อความของกล่องคำสั่งผสม


7
แน่นอนว่าเพิ่งตั้งข้อความในพื้นที่ที่สามารถแก้ไขได้ของ ComboBox แทนที่จะเลือกรายการที่เกี่ยวข้องจากรายการ? หากการรวบรวมข้อมูลในรายการมีวัตถุมากกว่าเพียงแค่สตริงฉันสงสัยว่ามันจะเลือกวัตถุ ListItem ที่เหมาะสม แต่มันจะตั้งค่าคุณสมบัติข้อความบน ComboBox หรือไม่
TabbyCool

9
มันจะตั้งค่าคุณสมบัติ SelectedValue ของการควบคุม
Henryk

ดี ใช้งานได้อย่างสวยงามสำหรับขนาดตัวอักษรน้ำหนักและแบบเลื่อนลงของครอบครัว ไม่มีการปลดเปลื้องหรือการแปลงระหว่างคลาส Soooo ง่ายกว่ามาก!
แลนซ์คลีฟแลนด์

3
ในกรณีที่: พารามิเตอร์นี้ต้องตั้งค่าหลังจากเติม combobox เท่านั้น
แอนทอนโรดริเกซ

12
รูปแบบหล่นลง combobox ของฉันคือ DropDownList และ. Text = "ข้อความบางส่วน" ไม่ทำงาน โซลูชันนี้ใช้งานได้ดีสำหรับฉัน: Combox1.SelectedIndex = Combox1.FindStringExact ("test1")
Mayank

48

สมมติว่าคอมโบบ็อกซ์ของคุณไม่ใช่ฐานข้อมูลคุณจะต้องค้นหาดัชนีของวัตถุในคอลเลกชัน "ไอเท็ม" ในแบบฟอร์มของคุณแล้วตั้งค่าคุณสมบัติ "selectedindex" เป็นดัชนีที่เหมาะสม

comboBox1.SelectedIndex = comboBox1.Items.IndexOf("test1");

โปรดทราบว่าฟังก์ชัน IndexOf อาจส่งข้อโต้แย้งหากไม่มีรายการ


1
โปรดจำไว้ว่า SelectedINDEX ไม่ใช่ SelectedITEM ... และคอมไพเลอร์จะไม่บ่นเพียงแค่ล้มเหลวในการตั้งค่า combobox
Rob

คุณไม่รักข้อผิดพลาดตรรกะที่ไม่ได้โยนข้อยกเว้นใด ๆ พวกเขาก็จะไม่ได้ทำงาน ...
Spence

นี่คือการเลือกรายการ แต่ไม่เรียกเหตุการณ์ onChange บนคอมโบ
mrid

39

หากรายการใน ComboBox ของคุณเป็นสตริงคุณสามารถลอง:

comboBox1.SelectedItem = "test1";

18

บันทึกวัน! รายการที่เลือกจะต้องตรงกับประเภท - นั่นคือสำหรับฉัน! ฉันเกาหัวของฉันว่าทำไมรายการที่เลือกไม่ได้ถูกตั้งไว้แม้กระทั่งรายการนั้นชัดเจน - กลายเป็นประเภทที่ไม่ตรงกัน!
Sudhanshu Mishra

เพื่อความสมบูรณ์มีประโยชน์ที่จะมีคำอธิบายจากลิงก์ด้านบนโดยเฉพาะอย่างยิ่งเนื่องจากคำตอบนี้ทำการตรวจสอบการจับคู่ที่แนะนำโดยคำตอบอื่น ๆ รวมถึงคำแนะนำที่ต้องการจาก @norbertB: เมื่อคุณตั้งค่าคุณสมบัติ SelectedItem เป็นวัตถุ ComboBox พยายามทำให้วัตถุนั้น รายการที่เลือกในปัจจุบันในรายการ ถ้าวัตถุที่พบในรายการ ,มันจะแสดงอยู่ในส่วนของการแก้ไข ComboBox และทรัพย์สิน SelectedIndex มีการตั้งค่าดัชนีที่สอดคล้องกัน ถ้าวัตถุนั้นไม่มีอยู่ในรายการคุณสมบัติ SelectedIndex จะถูกปล่อยทิ้งไว้ที่ค่าปัจจุบัน
DanG

10

สำหรับฉันมันใช้งานได้เท่านั้น:

foreach (ComboBoxItem cbi in someComboBox.Items)
{
    if (cbi.Content as String == "sometextIntheComboBox")
    {
        someComboBox.SelectedItem = cbi;
        break;
    }
}

MOD: และถ้าคุณมีวัตถุของคุณเองเป็นรายการตั้งค่าใน combobox แล้วแทนที่ ComboBoxItem กับหนึ่งในพวกเขาชอบ:

foreach (Debitor d in debitorCombo.Items)
{
    if (d.Name == "Chuck Norris")
    {
        debitorCombo.SelectedItem = d;
        break;
    }
}

2
สิ่งนี้ใช้งานได้สำหรับฉัน แต่คุณต้องระวังว่ารายการใน ComboBox ของคุณเป็นจริง ComboBoxItems เพราะมันเป็นไปได้ที่จะใส่รายการอื่น ๆ ในนั้น
อนุญาต

สิ่งนี้ทำงานได้ดีใน WinRT 8.1 ฉันห่อหน้าส่วนบนด้วยวิธีการขยายอย่างเดฟเขียนไว้ในโซลูชัน SelectItemByValue () ของเขาและมันก็เป็นโซลูชันที่สมบูรณ์แบบจริงๆ
Speednet

9

SelectedText คือการได้รับหรือการตั้งค่าข้อความจริงในตัวแก้ไขสตริงสำหรับรายการที่เลือกใน ComboBox เป็นเอกสารที่นี่ สิ่งนี้จะแก้ไขไม่ได้หากคุณตั้งค่า:

comboBox1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;

ใช้:

comboBox1.SelectedItem = "test1";

หรือ:

comboBox1.SelectedIndex = comboBox1.Items.IndexOf("test1");

1
comboBox1.Items.IndexOf ... เสี่ยงต่อ NullReferenceException หากรายการว่างเปล่า
แกรี่


7

ฉันใช้วิธีการขยาย:

public static void SelectItemByValue(this ComboBox cbo, string value)
{
    for(int i=0; i < cbo.Items.Count; i++)
    {
        var prop = cbo.Items[i].GetType().GetProperty(cbo.ValueMember);
        if (prop!=null && prop.GetValue(cbo.Items[i], null).ToString() == value)
        {
             cbo.SelectedIndex = i;
             break;
        }
    } 
}

จากนั้นใช้เมธอด:

ddl.SelectItemByValue(value);



4

โซลูชันนี้ใช้MSDNพร้อมการแก้ไขบางอย่างที่ฉันทำ

  • พบว่าถูกต้องหรือเป็นส่วนหนึ่งของสตริงและตั้งค่า

    private int lastMatch = 0;
    private void textBoxSearch_TextChanged(object sender, EventArgs e)
    {
        // Set our intial index variable to -1.
        int x = 0;
        string match = textBoxSearch.Text;
        // If the search string is empty set to begining of textBox
        if (textBoxSearch.Text.Length != 0)
        {
            bool found = true;
            while (found)
            {
                if (comboBoxSelect.Items.Count == x)
                {
                    comboBoxSelect.SelectedIndex = lastMatch;
                    found = false;
                }
                else
                {
                    comboBoxSelect.SelectedIndex = x;
                    match = comboBoxSelect.SelectedValue.ToString();
                    if (match.Contains(textBoxSearch.Text))
                    {
                        lastMatch = x;
                        found = false;
                    }
                    x++;
                }
            }
        }
        else
            comboBoxSelect.SelectedIndex = 0;
    }

ฉันหวังว่าฉันช่วย!


3

ฉันกรอก ComboBox ของฉันด้วย DataTable ที่กรอกข้อมูลจากฐานข้อมูล จากนั้นฉันได้ตั้งค่า DisplayMember และ ValueMember และฉันใช้รหัสนี้เพื่อตั้งค่ารายการที่เลือก

foreach (DataRowView Row in ComboBox1.Items)
{
    if (Row["ColumnName"].ToString() == "Value") ComboBox1.SelectedItem = Row;
}

1

คุณไม่มีคุณสมบัตินั้นใน ComboBox คุณมี SelectedItem หรือ SelectedIndex หากคุณมีวัตถุที่คุณใช้เติมคำสั่งผสมแล้วคุณสามารถใช้ SelectedItem

หากไม่ใช่คุณสามารถรับชุดของรายการ (รายการคุณสมบัติ) และวนซ้ำจนกว่าคุณจะได้รับค่าที่คุณต้องการและใช้กับคุณสมบัติอื่น ๆ

หวังว่ามันจะช่วย


1
_cmbTemplates.SelectedText = "test1"

หรืออาจจะ

_cmbTemplates.SelectedItem= _cmbTemplates.Items.Equals("test1");

ด้วยรหัสนี้คุณกำหนดบูลให้กับคุณสมบัติ SelectedItem ... จะไม่ทำงาน
Frederik Gheysels

1
  • แจกแจง ListItems ใน combobox
  • รับ listindex เท่ากับคนที่ตั้งค่า combobox
  • กำหนด listindex เป็นค่าที่พบ

แต่ถ้าฉันเห็นรหัสดังกล่าวเป็นผู้ตรวจสอบรหัสฉันขอแนะนำให้พิจารณาวิธีการอัลกอริทึมทั้งหมดใหม่


2
ทำไมคุณถึงให้มันเป็นคำตอบ?

1

ฉันใช้KeyValuePair สำหรับผูกข้อมูล ComboBox และฉันต้องการค้นหารายการตามมูลค่าดังนั้นสิ่งนี้จึงใช้ได้ในกรณีของฉัน:

comboBox.SelectedItem = comboBox.Items.Cast<KeyValuePair<string,string>>().First(item=> item.Value == "value to match");

1

ค้นหา mySecondObject (จากประเภท MyObject) ในคอมโบบ็อกซ์ (มีรายการ MyObjects) และเลือกรายการ:

foreach (MyObject item in comboBox.Items)
{
   if (item.NameOrID == mySecondObject.NameOrID)
    {
        comboBox.SelectedItem = item;
        break;
    }
}

0
  ListItem li = DropDownList.Items.FindByValue("13001");
  DropDownList.SelectedIndex = ddlCostCenter.Items.IndexOf(li);

สำหรับกรณีของคุณคุณสามารถใช้

DropDownList.Items.FindByText("Text");


0

เมธอดกลอุบายและบรรทัดทั้งหมดของการตั้งรหัสรายการ ComboBox จะไม่ทำงานจนกว่า ComboBox จะมีพาเรนต์


0

ฉันได้สร้างฟังก์ชั่นซึ่งจะส่งคืนดัชนีของค่า

        public static int SelectByValue(ComboBox comboBox, string value)
        {
            int i = 0;
            for (i = 0; i <= comboBox.Items.Count - 1; i++)
            {
                DataRowView cb;
                cb = (DataRowView)comboBox.Items[i];
                if (cb.Row.ItemArray[0].ToString() == value)// Change the 0 index if your want to Select by Text as 1 Index
                {
                    return i;
                }
            }
            return -1;
        }

0

มันใช้งานได้สำหรับฉัน .....

comboBox.DataSource.To<DataTable>().Select(" valueMember = '" + valueToBeSelected + "'")[0]["DislplayMember"];

1
ในขณะที่รหัสนี้อาจตอบคำถามได้ดีกว่าที่จะอธิบายวิธีการแก้ปัญหาและให้รหัสเป็นตัวอย่างหรือการอ้างอิง คำตอบที่ใช้รหัสเท่านั้นอาจทำให้สับสนและไม่มีบริบท
Robert Columbia

ขอบคุณสำหรับคำแนะนำ!
Jaydeep Karena


-2

โปรดลองด้วยวิธีนี้มันได้ผลกับฉัน:

Combobox1.items[Combobox1.selectedIndex] = "replaced text";

คุณควรตรวจสอบว่า SelectedIndex ไม่ใช่ -1 ก่อนหรือมากกว่านั้นอย่างแม่นยำว่า> = 0 และ <.items.length
แกรี่

-3

มันควรจะทำงาน

Yourcomboboxname.setselecteditem("yourstring");

และถ้าคุณต้องการตั้งค่าสตริงฐานข้อมูลให้ใช้สิ่งนี้

Comboboxname.setselecteditem(ps.get string("databasestring"));
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.