【问题标题】:Data not displaying in columns in grid UWP数据未显示在网格 UWP 的列中
【发布时间】:2020-12-15 10:40:04
【问题描述】:

我有一个链接到我的网格的数据库。添加数据时会出现一个新的复选框,因此它正在注册已输入的内容,但是列都是空白的。

我很确定问题是我为 Person 类设置了绑定。我是否可以继续使用这个类和一些额外的代码,或者找到一种方法将数据库中的数据分成列?

相关代码:

数据库类方法:

public static List<string> Grab_Entries()
        {
            List<string> entries = new List<string>();

            using (SqliteConnection db = new SqliteConnection("Filename=sqliteSample.db"))
            {
                db.Open();
                SqliteCommand selectCommand = new SqliteCommand("SELECT * from EmployeeTable", db);
                SqliteDataReader query;
                try
                {
                    query = selectCommand.ExecuteReader();
                }
                catch (SqliteException)
                {
                    //Handle error
                    return entries;
                }
                while (query.Read())
                {
                    entries.Add(query.GetString(0));

                }
                db.Close();
            }
            return entries;

MainPage 方法:

public void EmployeeGrid_Loaded(object sender, RoutedEventArgs e)
        {


            EmployeeGrid.ItemsSource = DB.Grab_Entries();
    }

主页 XAML:

<controls:DataGrid x:Name="EmployeeGrid" Margin="170,55,35,35"
                  ItemsSource="{x:Bind persons}"
                  CanUserSortColumns="True"
                  AutoGenerateColumns="False" Background="Black" Loaded="EmployeeGrid_Loaded">
            <controls:DataGrid.Columns>
                <controls:DataGridTextColumn Header="Employee ID"
                                             Binding="{Binding PersonId}"/>
                <controls:DataGridTextColumn Header="First Name"
                                             Binding="{Binding FirstName}"/>
                <controls:DataGridTextColumn Header="Last Name"
                                             Binding="{Binding LastName}"/>
                <controls:DataGridTextColumn Header="Address"
                                             Binding="{Binding Address}"/>
                <controls:DataGridTextColumn Header="Position"
                                             Binding="{Binding Position}"/>
                <controls:DataGridTextColumn Header="Pay Rate (ph)"
                                             Binding="{Binding PayratePH}"/>
                <controls:DataGridTextColumn Header="Sex"
                                             Binding="{Binding Sex}"/>
                <controls:DataGridTextColumn Header="TaxCode"
                                             Binding="{Binding TaxCode}"/>
                <controls:DataGridTextColumn Header="Email"
                                             Binding="{Binding Email}"/>
                <controls:DataGridTextColumn Header="Emergency Contact"
                                             Binding="{Binding EmergencyDetails}"/>
                <controls:DataGridCheckBoxColumn Header="Selected" 
                                                    />

            </controls:DataGrid.Columns>
        </controls:DataGrid>

我也会添加我的 Person 类:

    public class Person 
    {
            public int PersonId { get; set; }
            public int DepartmentId { get; set; }
            public string FirstName { get; set; }
            public string LastName { get; set; }
            public string Position { get; set; }
            public string Address { get; set; }
            public double PayratePH { get; set; }
            public string Sex { get; set; }
            public string TaxCode { get; set; }
            public string EmergencyDetails { get; set; }
            public string Email { get; set; }

【问题讨论】:

  • 您是否尝试在不使用数据库的情况下创建例如两个 Person 对象的列表,并尝试将其分配为数据网格的 itemssource,这将确定您的数据网格或数据库查询中是否有问题。
  • 嗨!非常感谢您的回复!我对网格条目进行了硬编码,它可以正确显示数据。我认为这可能与我的绑定有关

标签: sqlite uwp datagrid


【解决方案1】:

我可以在这里发现两件事。首先,主页 XAML 将项目源绑定到 persons,每当控件加载时,它都会被 DB.Grab_Entries() 的返回值覆盖。

EmployeeGrid_Loaded() 中,您应该填充 ItemsSource 绑定到的集合 (persons),而不是分配新集合。

加载的事件应该如下所示:

public void EmployeeGrid_Loaded(object sender, RoutedEventArgs e)
{
    this.persons.Clear();
    this.persons.AddRange(DB.Grab_Entries());
}

附:确保 ItemsSource 集合的类型为 ObservableCollection,否则它不会在元素更改时更新绑定。

其次,DB.Grab_Entries() 方法返回一个字符串列表,但从外观上看,数据网格和 persons 集合需要具有某些属性的人员对象列表。

当您从 sqlite 查询中读取数据时,您一次只能获得一列数据 (query.GetString(0))。您需要构造一个包含所有列值的对象并将该对象放入一个列表中。

【讨论】:

    【解决方案2】:

    正如@Darius S.所说,你绑定的DataGrid的ItemsSource是Person类的列表,但是DB.Grab_Entries()方法返回的是字符串类型的列表,所以DataGrid不能很好的显示。在您的 Grab_Entries 方法中,您可以获取每个属性的值,然后将它们转换为 Person 类。之后,将 Person 类添加到条目列表中。

    另外,推荐使用ObservableCollection类,当你在这个类中插入或移除数据时,它会自动更新UI。所以最好直接从 Grab_Entries 方法返回 ObservableCollection 类型。我以 FirstName 属性为例:

    public async static Task<ObservableCollection<Person>> Grab_Entries()
    {
        ObservableCollection<Person> entries = new ObservableCollection<Person>();
        string dbpath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "sqliteSample.db");
        using (SqliteConnection db = new SqliteConnection($"Filename={dbpath}"))
        {
            db.Open();
            SqliteCommand selectCommand = new SqliteCommand("SELECT * from EmployeeTable", db);
            using (var reader = await selectCommand.ExecuteReaderAsync())
            {
                var nameOrdinal = reader.GetOrdinal("First_Name");
                //The same method to get other properties
                while (await reader.ReadAsync())
                {
                    entries.Add(new Person() { FirstName = reader.GetString(nameOrdinal) });
                }
            }
            db.Close();
        }
        return entries;
    }
    

    MainPage.cs:

    ObservableCollection<Person> persons;
    
    public async void EmployeeGrid_Loaded(object sender, RoutedEventArgs e)
    {
        persons = await Person.Grab_Entries();
        EmployeeGrid.ItemsSource = persons;
    }
    

    【讨论】:

    • 非常感谢你们,你们都是传奇人物!
    猜你喜欢
    • 2016-09-16
    • 1970-01-01
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多