【问题标题】:Get selected value from combo box in C# WPF从 C# WPF 中的组合框中获取选定的值
【发布时间】:2010-12-04 02:26:21
【问题描述】:

我刚刚开始使用 WPF 表单而不是 Windows 表单表单。在 Windows 窗体中,我可以这样做:

ComboBox.SelectedValue.toString();

这会很好。

如何在 WPF 中执行此操作?好像没有这个选项。

【问题讨论】:

  • 试试 SelectedItem。为什么使用 typename ComboBox 作为变量名?!
  • 我实际上并没有使用 ComboBox 作为变量名。我应该更清楚地说明组合框实际上是 cboType,所以我使用的是 cboType.SelectedValue.toString()。我已经尝试过 selectedItem 但它不仅给了我它还显示 System.Windows.Controls.ComboBoxItem: Software 的值。软件是我只想要那个值的值名称,所以剩下的就在手边。感谢您的帮助
  • 我将“WF”解释为“Windows 窗体”,而不是“Windows Workflow Foundation”。什么是正确的? (通过编辑您的问题来回应,而不是在 cmets 中。)
  • @PeterMortensen 我不确定你在说什么,这个问题在每一点都说 WPF,从来没有 WF

标签: c# wpf combobox


【解决方案1】:

与旧的 WF 表格相比,我发现它的做法有点奇怪:

ComboBoxItem typeItem = (ComboBoxItem)cboType.SelectedItem;
string value = typeItem.Content.ToString();

【讨论】:

  • 很奇怪。这一行:'ComboBoxItem typeItem = (ComboBoxItem)cboType.SelectedItem;'导致我出错...
  • @GuyCohen 它应该是 ComboBox 而不是 ComboBoxItem
  • @Tariq 您最好发布一个新问题,因为需要查看代码以提供真正的帮助。但看起来你试图从 DataGrid 而不是 Combo Box 获取值
【解决方案2】:

嗯..我找到了一个更简单的解决方案。

String s = comboBox1.Text;

这样我将选定的值作为字符串。

【讨论】:

  • 我在 SelectionChanged 事件处理程序中尝试了这个,但文本仍然设置为旧值而不是新选择的项目:( 将使用 Boardy 的答案。
  • 这不起作用,至少在 WPF 中动态添加项目时不起作用。我不明白这么多的赞成票。 ((ComboBoxItem)comboBox1.SelectedItem).Content.ToString(); 应该是正确的代码
  • 如果在带有“SelectionChanged”和其他内容的上下文中使用此答案,则会导致问题。 '(MyCombobox.SelectedItem as ComboBoxItem).Content.ToString()' 在我看来是一个更好的解决方案。
  • 它对我不起作用。我动态添加组合框项目。谢谢
  • comboBox1.Text 将显示最后选择的值。在Selection_changed时,选择新值时,上述仍将返回旧值。 span>
【解决方案3】:

我的 XAML 如下:

<ComboBox Grid.Row="2" Grid.Column="1" Height="25" Width="200" SelectedIndex="0" Name="cmbDeviceDefinitionId">
    <ComboBoxItem Content="United States" Name="US"></ComboBoxItem>
    <ComboBoxItem Content="European Union" Name="EU"></ComboBoxItem>
    <ComboBoxItem Content="Asia Pacific" Name="AP"></ComboBoxItem>
</ComboBox>

内容显示为文本和 WPF 组合框的名称。要获取所选项目的名称,我遵循以下代码行:

ComboBoxItem ComboItem = (ComboBoxItem)cmbDeviceDefinitionId.SelectedItem;
string name = ComboItem.Name;

获取 WPF 组合框的选定文本:

string name = cmbDeviceDefinitionId.SelectionBoxItem.ToString();

【讨论】:

    【解决方案4】:

    确保您已在 XAML 文件中设置组合框的名称:

    <ComboBox Height="23" Name="comboBox" />
    

    在您的代码中,您可以使用SelectedItem 属性访问所选项目:

    MessageBox.Show(comboBox.SelectedItem.ToString());
    

    【讨论】:

    • 我已经尝试过这样做,但它的工作方式与旧的 WF 形式不同。在旧的 WF 表单中,它只会给出选定的值,但现在它的打印:System.Windows.Controls.ComboBoxItem: Software。在不打印 System.Windows.Controls.ComboBoxItem 的情况下,我如何才能像以前一样获得值。感谢您的帮助
    • 很好的解决方案,简单有效!!
    【解决方案5】:

    这取决于您绑定到 ComboBox 的内容。如果您绑定了一个名为 MyObject 的对象,并且拥有一个名为 Name 的属性,请执行以下操作:

    MyObject mo = myListBox.SelectedItem as MyObject;
    return mo.Name;
    

    【讨论】:

      【解决方案6】:

      这些怎么样:

      string yourstringname = (yourComboBox.SelectedItem as ComboBoxItem).Content.ToString();
      

      【讨论】:

      • 这和ComboBox.SelectionBoxItemStringFormat有什么区别?
      • 当你打算使用 as 而不是 cast 时,为什么要使用它,就好像它不是 null 一样?
      【解决方案7】:

      作为 ComboBox SelectionChanged 事件处理程序中的一个变体:

      private void ComboBoxName_SelectionChanged(object send ...
      {
          string s = ComboBoxName.Items.GetItemAt(ComboBoxName.SelectedIndex).ToString();
      }
      

      【讨论】:

        【解决方案8】:

        我遇到了类似的问题并尝试了该线程中建议的许多解决方案,但发现 SelectionChanged 事件在 ComboBox 项目实际更新以显示新选择之前触发(即,它总是先给出组合框的内容发生的变化)。

        为了克服这个问题,我发现最好使用自动传递给事件处理程序的 e 参数,而不是尝试直接从组合框中加载值。

        XAML:

        <Window.Resources>
            <x:Array x:Key="Combo" Type="sys:String">
                <sys:String>Item 1</sys:String>
                <sys:String>Item 2</sys:String>
            </x:Array>
        </Window.Resources>
        <Grid>
            <ComboBox Name="myCombo" ItemsSource="{StaticResource Combo}" SelectionChanged="ComboBox_SelectionChanged" />
            <TextBlock Name="MyTextBlock"></TextBlock>
        </Grid>
        

        C#:

        private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            string chosenValue = e.AddedItems[0].ToString();
        }
        

        【讨论】:

        • 这应该被认为是一个有用的答案!
        【解决方案9】:

        解决这个问题很简单。我所做的只是将“SelectedValuePath”添加到我的 XAML 代码中,并将其绑定到我想通过组合框返回的模型属性。

        <ComboBox SelectedValuePath="_Department"
                  DisplayMemberPath="_Department"
                  Height="23"
                  HorizontalAlignment="Left"
                  ItemsSource="{Binding}"
                  Margin="-58,1,0,5"
                  Name="_DepartmentComboBox"
                  VerticalAlignment="Center"
                  Width="268"/>
        

        【讨论】:

          【解决方案10】:

          这在很大程度上取决于盒子的填充方式。如果通过将DataTable(或其他集合)附加到ItemsSource 来完成,您可能会发现在XAML 中将SelectionChanged 事件处理程序附加到您的框,然后在代码隐藏中使用它很有用:

          private void ComboBoxName_SelectionChanged(object sender, SelectionChangedEventArgs e)
          {
              ComboBox cbx = (ComboBox)sender;
              string s = ((DataRowView)cbx.Items.GetItemAt(cbx.SelectedIndex)).Row.ItemArray[0].ToString();
          }
          

          我在这里看到了 2 个其他答案,其中有不同的部分 - 一个有 ComboBoxName.Items.GetItemAt(ComboBoxName.SelectedIndex).ToString();,看起来很相似,但没有将框转换为 DataRowView,这是我发现我需要做的事情,另一个: ((DataRowView)comboBox1.SelectedItem).Row.ItemArray[0].ToString();,使用 .SelectedItem 而不是 .Items.GetItemAt(comboBox1.SelectedIndex)。这可能行得通,但我确定的实际上是我上面写的两者的组合,并且不记得我为什么避免 .SelectedItem 除非它在这种情况下对我不起作用。

          如果您是动态填充框,或者直接在 XAML 中的下拉列表中使用 ComboBoxItem 项目,这是我使用的代码:

          private void ComboBoxName_SelectionChanged(object sender, SelectionChangedEventArgs e)
          {
              ComboBox cbx = (ComboBox)sender;
              string val = String.Empty;
              if (cbx.SelectedValue == null)
                  val = cbx.SelectionBoxItem.ToString();
              else
                  val = cboParser(cbx.SelectedValue.ToString());
          }
          

          你会看到我有cboParser,在那里。这是因为SelectedValue 的输出如下所示:System.Windows.Controls.Control: Some Value。至少在我的项目中是这样。所以你必须解析你的Some Value

          private static string cboParser(string controlString)
          {
              if (controlString.Contains(':'))
              {
                  controlString = controlString.Split(':')[1].TrimStart(' ');
              }
              return controlString;
          }
          

          但这就是为什么这个页面上有这么多答案。这在很大程度上取决于您如何填充盒子,以及如何从中获得价值。答案可能在一种情况下是正确的,而在另一种情况下可能是错误的。

          【讨论】:

            【解决方案11】:

            在 WPF 设计中创建一个 ComboBox SelectionChanged 事件并设置 ItemsSource="{Binding}":

            代码:

            private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
            {
                string ob = ((DataRowView)comboBox1.SelectedItem).Row.ItemArray[0].ToString();
                MessageBox.Show(ob);
            }
            

            【讨论】:

              【解决方案12】:
              private void usuarioBox_TextChanged(object sender, EventArgs e)
              {
                  string textComboBox = usuarioBox.Text;
              }
              

              【讨论】:

                【解决方案13】:
                MsgBox(cmbCut.SelectedValue().ToString())
                

                【讨论】:

                  【解决方案14】:

                  要在 C# 中获取 ComboBox 的选定索引的值,请使用:

                  Combobox.SelectedValue
                  

                  【讨论】:

                    【解决方案15】:

                    原理是一样的。

                    您既可以使用 SelectedIndex,也可以使用 ComboBox.Items[SelectedIndex].ToString()。或者只是 ComboBox.SelectedItem 并将其转换为您需要的任何类型:)

                    【讨论】:

                      【解决方案16】:

                      其实你也可以通过下面的方式来实现。

                      假设您的 ComboBox 名称是 comboBoxA。那么它的值可以得到为:

                      string combo = comboBoxA.SelectedValue.ToString();
                      

                      我认为它现在得到支持,因为您的问题已经存在五年了。

                      【讨论】:

                      • 这将返回System.Windows.Controls.ComboBoxItem: YourItem(对我来说)。当我使用ComboBox.SelectionBoxItemStringFormat (.NET 4.7) 时,它会将实际值作为ComboBox.Content 属性中定义的字符串返回。
                      【解决方案17】:

                      这样写:

                      String CmbTitle = (cmb.SelectedItem as ComboBoxItem).Content.ToString()
                      

                      【讨论】:

                      • 解释一下。
                      【解决方案18】:

                      如果你想获取值并验证它,你可以这样做

                      string index = ComboBoxDB.Text;
                              if (index.Equals(""))
                              {                
                                  MessageBox.Show("your message");
                              }
                              else
                              {
                                  openFileDialog1.ShowDialog();
                                  string file = openFileDialog1.FileName;
                                  reader = new StreamReader(File.OpenRead(file));
                              }
                      

                      【讨论】:

                        【解决方案19】:
                                // -----------------------------------------------------------------
                        
                                private void onSelectionChanged(object sender, 
                                                                SelectionChangedEventArgs e)
                                {
                                    String result = ((ComboBox)sender).SelectedItem.ToString();
                                    // do something with result
                                }
                        
                                // -----------------------------------------------------------------
                        

                        【讨论】:

                          【解决方案20】:

                          我发现这很有用。我把它留在这里以防万一有人需要它:

                          获取值:

                          (comboBox1.SelectedItem as dynamic).Value
                          

                          获取文本:

                          (comboBox1.SelectedItem as dynamic).Text
                          

                          【讨论】:

                            【解决方案21】:
                            <ComboBox x:Name="TestComboBox" SelectionChanged="TestComboBox_SelectionChanged" Padding="2">
                                <ComboBoxItem>Item 1</ComboBoxItem>
                                <ComboBoxItem>Item 2</ComboBoxItem>
                            </ComboBox>
                            

                            方法一

                            string content = (((sender as ComboBox).SelectedValue) as ComboBoxItem).Content.ToString();
                            

                            方法二

                            string content = (string)((ComboBoxItem)((ComboBox)sender).SelectedValue).Content;
                            

                            【讨论】:

                              【解决方案22】:

                              一个适合我的简单解决方案是:

                              string name = (string)combobox.SelectedItem
                              

                              【讨论】:

                              • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
                              【解决方案23】:

                              我使用此代码,它对我有用:

                              DataRowView typeItem = (DataRowView)myComboBox.SelectedItem; 
                              string value = typeItem.Row[0].ToString();
                              

                              【讨论】:

                              • 解释一下。
                              【解决方案24】:

                              XAML:

                              <ComboBox Height="23" HorizontalAlignment="Left" Margin="19,123,0,0" Name="comboBox1" VerticalAlignment="Top" Width="33" ItemsSource="{Binding}" AllowDrop="True" AlternationCount="1">
                                  <ComboBoxItem Content="1" Name="ComboBoxItem1" />
                                  <ComboBoxItem Content="2" Name="ComboBoxItem2" />
                                  <ComboBoxItem Content="3" Name="ComboBoxItem3" />
                              </ComboBox>
                              

                              C#:

                              if (ComboBoxItem1.IsSelected)
                              {
                                  // Your code
                              }
                              else if (ComboBoxItem2.IsSelected)
                              {
                                  // Your code
                              }
                              else if(ComboBoxItem3.IsSelected)
                              {
                                  // Your code
                              }
                              

                              【讨论】:

                                【解决方案25】:

                                它对我有用:

                                System.Data.DataRowView typeItem = (System.Data.DataRowView)ComboBoxName.SelectedItem;
                                string value = typeItem.DataView.ToTable("a").Rows[0][0].ToString();
                                

                                【讨论】:

                                  猜你喜欢
                                  • 1970-01-01
                                  • 2013-10-27
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 2019-11-16
                                  • 1970-01-01
                                  • 2014-03-23
                                  相关资源
                                  最近更新 更多