从SQL数据库在UWP中填充ComboBox

时间:2019-06-24 09:29:09

标签: c# uwp

我正在尝试从SQL数据库将数据填充到UWP中的ComboBox。我尝试了DataTables和代码中显示的其他方法。我有两个代码示例,我试图解决这个问题。

我正在努力达到XAML UWP中comboBox的结果,以具有教师姓名并将其FacultyID绑定在后端。 您的帮助会有所帮助

我已经在线搜索并尝试使用DataTablesDataSource,数据绑定,现在使用代码SAMPLE 2中的简单逻辑。

 //Sample 1: This is the logic i'm trying to implement
using (SqlConnection MyConn = new SqlConnection(App.ConnectionString))
{
    try
    {

        SqlDataAdapter adapter = new SqlDataAdapter("select * from faculty", MyConn);
        DataTable allfaculty = new DataTable();

        adapter.Fill(allfaculty);

        for (int i = 0; i < allfaculty.Rows.Count; i++)
        {
            cmbEditFaculty.Items.Add(allfaculty.Rows[i]["name"]);
        }

    }
    catch (Exception)
    {
        //Do Something
    }
}

//示例2带有在UWP中填充ComboBox的想法

adapter = new SqlDataAdapter(command);
adapter.Fill(allfaculty);
MyConn.Close();

try
{
    foreach (DataRow dr in allfaculty.Rows)
    {
        //for example 1st column is an int, 2nd is a string:
        int col1 = (int)dr[0];
        string col2 = (string)dr[1];
        cmbEditFaculty.ItemsSource = allfaculty;
    }
}

2 个答案:

答案 0 :(得分:0)

将数据绑定到UWP控件时,建议使用ObservableCollection<T>,它也实现INotifyCollectionChanged,它会观察到所有更改并在添加或删除新项目时自动更新控件。

我建议添加一种FacultyItem类,该类表示列表中的单个项目,然后具有一个ObservableCollection<T>属性,例如:

public ObservableCollection<FacultyItem> Faculties {get;} =
   new ObservableCollection<FacultyItem>();

要将属性设置为数据源,可以通过代码设置(不理想):

cmbEditFaculty.ItemsSource = Faculties;

或通过数据绑定(更好)进行设置,例如:

<ComboBox ItemsSource="{x:Bind Faculties}" />

现在,当您从数据库读取数据时,您将首先构造FacultyItem实例:

//read from db, using a data reader, or a data set, anything
FacultyItem[] facultiesFromDb = GetFacultiesFromDb();

然后将它们一个一个地添加到集合中:

foreach (var faculty in facultiesFromDb)
{
    Faculties.Add(faculty);
}

如果您需要清除列表(要完全替换集合),可以先致电Faculties.Clear()

这当然是非常笼​​统的描述,我强烈建议您阅读有关MVVM设计模式和数据绑定的更多信息-很好地记录在Microsoft文档here中。

答案 1 :(得分:0)

Martin Zikmund 的回答可能是正确的方法,但我已经有了想要使用的来自 Asp.Net 的代码。这适用于我可以选择列表中的对象并在选择更改时获取所选对象的值。

在 xaml 中

<ComboBox Name="ddlSelectList" Header="Colors" PlaceholderText="Existing Lists" Width="200" SelectedValuePath="Content" SelectionChanged="DdlSelectList_SelectionChanged" >

        </ComboBox>

从普通的旧数据表中添加列表项

DataTable dt = new DataTable();
        dt = nModel.DataDAL.ListDataDAL.JobListDataTable();

        this.ddlSelectList.DisplayMemberPath = "HashId";          

        for (int i = 0; i < dt.Rows.Count; i++)
        {
            ddlSelectList.Items.Add(new ComboBoxItem { Content = dt.Rows[i]["HashId"].ToString() });
        }

要在选择时更改所选项目的值:

 private void DdlSelectList_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {            
        if (ddlSelectList == null) return;
        var combo = (ComboBox)sender;
        var item = (ComboBoxItem)combo.SelectedItem;         
        string test = item.Content.ToString();
    }

将 DataTable 转换为 List<> 并将其显示在 ComboBox 中是小菜一碟。获取索引更改时的值将引发此错误:

无法将“YourList”类型的对象转换为“Windows.UI.Xaml.Controls.ComboBoxItem”

使用上面的方法,它只是将项目添加为 ComboBoxItems,一切都开始工作了。

同样,可能不是首选方式,但它是一种方式。