从WPF组合框中获取所选项目,该组合框由访问数据库中的数据填充

时间:2014-04-11 17:33:07

标签: c# wpf windows xaml ms-access

我有一个组合框,使用以下代码

来访问数据库中的数据
public void BindComboBox(ComboBox ComboBoxOrg)
{
    con.Open();
    orgload = new OleDbCommand("SELECT organization_id, short_name FROM organization", con);
    OleDbDataAdapter da = new OleDbDataAdapter();
    da.SelectCommand = orgload;
    DataSet ds = new DataSet();
    da.Fill(ds);
    ComboBoxOrg.ItemsSource = ds.Tables[0].DefaultView;
    ComboBoxOrg.DisplayMemberPath = ds.Tables[0].Columns["short_name"].ToString();
    ComboBoxOrg.SelectedValuePath = ds.Tables[0].Columns["organization_id"].ToString();
    con.Close();
}

XAML UI代码是

<ComboBox  x:Name="ComboBoxOrg" 
    Width="308"
    Height="40"
    HorizontalAlignment="Left"
    VerticalAlignment="Top"
    FontSize="18"
    Margin="0,0,0,100" Foreground="#FF666666"
    ItemsSource="{Binding}"/>      

我想获取SELECTED ITEM然后用它来查询其id存在的表(用户),例如。

OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source = C:\hcsshare\hcsshare.accdb; Persist Security Info=False");
cmd = new OleDbCommand("SELECT short_name FROM organization WHERE short_name='" + SELECTED_ITEM + "'", con);
OleDbDataAdapter adapter = new OleDbDataAdapter();
adapter.SelectCommand = cmd;
DataSet dataSet = new DataSet();
adapter.Fill(dataSet);
if (dataSet.Tables[0].Rows.Count > 0)
{
}

组合框填充得很好,那么如何从组合框中获取SELECTED_ITEM呢?

3 个答案:

答案 0 :(得分:1)

你可以这样做:

string value =ComboBoxOrg.SelectedItem.Text();

string Value="";
if(ComboBoxOrg.SelectedIndex>=0) 
  Value=((ComboBoxItem)ComboBoxOrg.SelectedItem).Content.ToString();

答案 1 :(得分:0)

您的SelectedValuePath是organization_id,而您使用selectedValue与short_name匹配,将查询条件更改为WHERE organization_id = selected_value_of_combobox。

试试这个,没有经过测试,但绝对可以帮到你:

DataSet dataSet = new DataSet();
using (OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source = C:\hcsshare\hcsshare.accdb; Persist Security Info=False"))
{
    con.Open();
    OleDbCommand cmd = new OleDbCommand("SELECT short_name FROM organization WHERE organization_id=?", con);
    cmd.Parameters.Add("?", ComboBoxOrg.SelectedValue);

    using (var adapter = new OleDbDataAdapter(cmd)) 
    {
        adapter.Fill(data);
    }
}
if (dataSet.Tables[0].Rows.Count > 0)
{
    //your code goes....
}

或者,如果您确实需要将selectedValue与short_name匹配,

使用此查询:

SELECT short_name FROM organization WHERE short_name=?

并将其添加为参数:

cmd.Parameters.Add("?", ((ComboBoxItem)ComboBoxOrg.SelectedItem).Content.ToString());

了解更多here

答案 2 :(得分:0)

所以当我在 post_id | date | status -----------+-------------+--------- 3 | 2016-09-01 | null 3 | 2016-09-02 | 1 3 | 2016-09-03 | 1 3 | 2016-09-04 | 2 3 | 2016-09-05 | 2 6 | 2016-09-01 | null 6 | 2016-09-02 | null 6 | 2016-09-03 | 1 6 | 2016-09-04 | 2 6 | 2016-09-05 | 2 的框上有一个事件处理程序时,我发现这些方法都没有工作,除非我这样做:

SelectionChanged

它很难看,但这是我能在这个功能中获得价值的唯一方法。另一个选项是,如果您使用private void MyBox_SelectionChanged(object sender, SelectionChangedEventArgs e) { ComboBox cbx = sender as ComboBox; string myValue = ((DataRowView)cbx.Items.GetItemAt(cbx.SelectedIndex))).Row.ItemArray[0].ToString(); } 执行DropDownClosed,则可以直接获取该框的EventArgs e。我相信这是因为.Text事件在实际设置文本之前会触发,所以你必须回到&#34;手动&#34;获取所选索引处的项目,而如果在框关闭后执行此操作,则已设置该值。这是一个关键概念,对许多人来说可能是次要的,但对其他人来说并不明显。