C# 从由access数据库中的数据填充的WPF组合框中获取选定项
我有一个组合框,它由access数据库中的数据填充,使用以下代码C# 从由access数据库中的数据填充的WPF组合框中获取选定项,c#,wpf,windows,xaml,ms-access,C#,Wpf,Windows,Xaml,Ms Access,我有一个组合框,它由access数据库中的数据填充,使用以下代码 public void BindComboBox(ComboBox ComboBoxOrg) { con.Open(); orgload = new OleDbCommand("SELECT organization_id, short_name FROM organization", con); OleDbDataAdapter da = new OleDbDataAdapter(); da.Se
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}"/>
组合框填充得很好,因此如何从组合框中获取所选的项目?您可以通过以下方式简单地完成:
string value =ComboBoxOrg.SelectedItem.Text();
或
您的SelectedValuePath是organization\u id,而您正在使用selectedValue与简短的\u名称匹配,请将查询条件更改为其中organization\u id=selected\u value\u of \u 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与短名称匹配
使用此查询:
SELECT short_name FROM organization WHERE short_name=?
并将其添加为参数:
cmd.Parameters.Add("?", ((ComboBoxItem)ComboBoxOrg.SelectedItem).Content.ToString());
阅读更多。因此,当我的
选择框中的事件处理程序发生更改时,我发现这些方法都不起作用,除非我这样做:
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();
}
这很难看,但这是我在这个函数中得到值的唯一方法。另一个选项是,如果使用EventArgs e
执行DropDownClosed
,则可以直接获取框的.Text
。我认为这是因为SelectionChanged
事件在实际设置文本之前触发,因此您必须“手动”返回以获取所选索引中的项目,而如果在框关闭后执行此操作,则已设置值。这是一个关键概念,可能是许多人的第二天性,但对其他人来说并不明显。谢谢@jomsk1e我真的需要知道SelectedItem、SelectedValue和SelectedValuePath之间的区别这对我帮助很大。我设法使用字符串selectedorg=comboxorg.Text获取所选值;现在,我试图从organization表中获取组织id,然后在成功登录之前将其与users表中的组织id进行比较。我将感谢您在这方面的帮助。感谢您的回答@Ehsan Sajjad我尝试使用您的示例,但遇到了一个错误“无法将源类型“object”转换为目标类型“string”。为了解决这个问题,我必须将所选值转换为string(即(string)组合框。SelectedValue)但在运行期间,我还是遇到了另一个错误,谢谢你的回答,我使用了string selectedorg=comboxorg.Text;它工作得很好。不客气。我在我的答案中进行了编辑,这样它就可以帮助其他人解决同样的问题Comboboxorg.Text返回了SelectedItem文本??是的,它确实返回了SelectedItem文本。我正在使用WPF。好的,我编辑了我的答案,这样,如果有人寻求帮助,其他人会正确地得到答案
cmd.Parameters.Add("?", ((ComboBoxItem)ComboBoxOrg.SelectedItem).Content.ToString());
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();
}