检索Combobox的单个项目

时间:2013-05-07 13:56:15

标签: wpf combobox datatable dataset selectedvalue

在我的 WPF 应用程序中,我将一个Combobox作为“ComboBox1”,其中包含来自tabel “Login”的项目。现在我想检索combobox1中的选定值。例如:表“登录”由记录一,二,三组成。我刚刚通过数据表将这些值添加到了combobox1中。然后当我想在combobox1 中打印选定的值时。如何做到这一点...... WPF 。我已经给出了以下编码,用于保存带有项目的combobox1。

        SqlDataAdapter Da = new SqlDataAdapter();
        DataSet Ds = new DataSet();

        Con.Open();
        Cmd = new SqlCommand("select Id from Login", Con);
        Da.SelectCommand = Cmd;
        try 
        {
            Da.Fill(Ds, "User_Id");
            comboBox1.DataContext = Ds.Tables["User_Id"].DefaultView;
            comboBox1.DisplayMemberPath = Ds.Tables["User_Id"].Columns["Id"].ToString();
        }
        catch(Exception ex)
        {
            MessageBox.Show("Table can't be updated");
        }
        Con.Close();

用于检索所选值的编码如下:

if (comboBox1.SelectedItem != null)
        {
            ComboBoxItem typeItem = (ComboBoxItem)comboBox1.SelectedItem;
            string value = typeItem.Content.ToString();
            textBox5.Text = value;
        }

注意:请点击此链接以清楚了解问题:http://postimg.org/image/bn27nae65/

1 个答案:

答案 0 :(得分:1)

这是名为“_combo”的组合框的xaml:

<ComboBox SelectedValue="{Binding SelectedValue}" x:Name="_combo" >
      <ComboBoxItem Content="One"/>
      <ComboBoxItem Content="Two"/>
      <ComboBoxItem Content="Three"/>
</ComboBox>

这是背后的代码:

private string _SelectedItem;
public string SelectedItem
{
    get { return _SelectedItem; }
    set
    {
        _SelectedItem = value;
        OnPropertyChanged("SelectedItem");
        textbox5.text = _combo.Content.ToString();
    }
}

如果这让您感到困惑,请查看数据绑定和“Inotifypropertychanged”。

编辑:这是我输入的简短样本中的所有代码。

基本上你有一个名为MainViewModel的对象,XAML中的所有属性都绑定到视图模型对象属性。下面,TextBox有一个名为text的属性,默认为“ComboBox绑定示例 - ...”,因为这是视图模型中的字符串属性所绑定的。如果更改框中的文本,则更改后面代码中的属性值。如果您在代码中编写的某些代码更改了属性,则文本框也将在XAML中更新。这是在WPF中开发的最佳方式! (或大部分时间至少)。我花了很长时间才明白这是如何工作的,但是一旦我得到它,开发就变得更快更容易了。最重要的是,你可以完全改变你的GUI外观,而后面的代码可以保持所有的操作保持不变。

这也可以通过向ComboBox添加选择更改事件来完成。在这种情况下它实际上更容易,但没有提供INotifyPropertyChanged所做的功率。即因为事件只在一个方向上发射,即ComboBox_Changed - &gt;事件在代码中触发。 INotifyPropertyChanged适用于两个方向。

这种编码风格称为MVVM。虽然它经常让初学者感到困惑,但是一旦你把它打倒,这对于应用程序来说是一种很棒的方式。

<Window x:Class="ComboBoxSample.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525" x:Name="view">
<Grid>
    <StackPanel>
        <TextBox x:Name="_textbox" Margin="5,5,5,5" Text="{Binding DataContext.text, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}" />
        <ComboBox x:Name="_combo"  Margin="5,0,5,5" SelectedItem="{Binding DataContext.SelectedItem, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}">
            <ComboBoxItem Content="Blue"/>
            <ComboBoxItem Content="Red"/>
            <ComboBoxItem Content="Green"/>
            <ComboBoxItem Content="Black"/>
        </ComboBox>
        <TextBox x:Name="_textbox2" Text="Other method for updating text" Margin="5,5,5,5"/>
        <ComboBox x:Name="_combo2" SelectionChanged="ComboBox_SelectionChanged">
            <ComboBoxItem Content="One"/>
            <ComboBoxItem Content="Two"/>
            <ComboBoxItem Content="Three"/>
        </ComboBox>
    </StackPanel>
</Grid>

这是mainwindow.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace ComboBoxSample
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new MainViewModel(_combo);
    }

    private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        string value = _combo2.Items[_combo2.SelectedIndex].ToString().Substring(38);
        _textbox2.Text = value;
    }
}
}

这是所有重要的视图模型:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ComboBoxSample
{
public class MainViewModel : INotifyPropertyChanged
{
    public ComboBox combo;
    public TextBox textbox;

    public MainViewModel(ComboBox _combo)
    {
        combo = _combo;
    }

    private string _text = "ComboBox Binding Example --Changing the combox will change this text!";
    public string text
    {
        get { return _text; }
        set
        {
            _text = value;
            OnPropertyChanged("text");
        }
    }

    private string _SelectedItem;
    public string SelectedItem
    {
        get { return _SelectedItem; }
        set
        {
            _SelectedItem = value;
            OnPropertyChanged("SelectedValue");
            string val = combo.Items[combo.SelectedIndex].ToString().Substring(38);
            text = val;
        }
    }



    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

}