【问题标题】:How to fill a WPF Datagrid but not directly from the DB using C#如何使用 C# 填充 WPF 数据网格,但不直接从数据库中填充
【发布时间】:2013-05-14 18:40:18
【问题描述】:

我一直在用头撞墙一段时间。我正在尝试使用 C# .net 从 mysql 数据库中填充 WPF 数据网格。问题是我需要在将数据粘贴到数据网格之前对其进行修改,因为数据格式不正确。搜索时我能找到的唯一示例是如何自动将查询中的数据直接粘贴到数据库中。

这是我从 mysql 获取的当前表的样子。

1   0456    clockin         5/14/2013 8:36:26 AM
2   0456    breakout    5/14/2013 8:36:39 AM
3   0456    breakin     5/14/2013 8:36:40 AM
4   0456    clockout    5/14/2013 8:36:41 AM
5   0456    clockin         5/14/2013 8:37:14 AM
6   0456    breakout    5/14/2013 8:50:27 AM
7   0456    breakin     5/14/2013 8:50:34 AM

现在我需要使用给定的用户 ID (0456) 消除一周 (5/12 - 5/18) 的所有挑战。然后我需要将这些值粘贴到设置为一周中的 7 天的数据网格中。因此,它会在每一天的下方列出所有的出拳(打卡、休息等)及其相关时间。

编辑:tnw 要求提供代码。这是我的数据网格 XML:

<DataGrid AutoGenerateColumns="False" Height="253" HorizontalAlignment="Center" Margin="219,208,0,0" Name="weekHours" VerticalAlignment="Top" Width="556" HorizontalContentAlignment="Center" CanUserAddRows="True" CanUserReorderColumns="False" CanUserResizeColumns="False" CanUserResizeRows="False" CanUserSortColumns="False" Focusable="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Action" Width="100"/>
            <DataGridTextColumn Header="Sun" Width="65"/>
            <DataGridTextColumn Header="Mon" Width="65"/>
            <DataGridTextColumn Header="Tue" Width="65"/>
            <DataGridTextColumn Header="Wed" Width="65"/>
            <DataGridTextColumn Header="Thu" Width="65"/>
            <DataGridTextColumn Header="Fri" Width="65"/>
            <DataGridTextColumn Header="Sat" Width="65"/>
        </DataGrid.Columns>
    </DataGrid>

然后对于后面的代码,这就是我能找到的关于如何填充 Datagrid 的全部内容。

public void FillDataGrid(String query, DataGrid dg)
    {
        //Open connection
        if (this.OpenConnection() == true)
        {
            //Create Command
            MySqlCommand cmd = new MySqlCommand(query, connection);
            DataTable dt = new DataTable();
            MySqlDataAdapter da = new MySqlDataAdapter(cmd);
            da.Fill(dt);
            dg.DataContext = dt;
        }
    }

任何帮助将不胜感激。我是 C# 和 .net 的新手。也许我什至不应该为此使用数据网格。 谢谢 迈克

【问题讨论】:

  • 向我们展示您的代码。你试过什么?
  • 我不鼓励在 WPF 客户端使用 System.Data。创建适当的数据模型并使用 ORM,或至少使用 Micro-ORM instaed。

标签: c# wpf datagrid


【解决方案1】:

您可以使用绑定到您的DataGrid 的视图模型。从数据库加载数据后,遍历记录并创建视图模型。 以下 sn-p 显示了一种解决问题的方法:

MyViewModel.cs:

 public class MyViewModel
 {
      public DateTime Date { get; set; }
      public int Punches { get; set; }
      public int UserId { get; set; }
 }

在这里将数据绑定到 DataGrid:

 var viewModels = new List<MyViewModel>();

 foreach(var item in dt.Rows)
 {
      var vm = new MyViewModel();
      vm.UserId = item["UserId"];
      vm.Punches = item["Punches"];
      vm.Date = DateTime.Parse(item["Date"]);
      //....
      viewModels.Add(vm);
 }
 dg.DataContext = viewModels;

如果您使用 WPF 并且可能使用 MVVM,这是一种常见的模式。视图模型包含实际数据,但可以选择修改以更好地显示在视图中(这里是您的DataGrid)。 如果您进行一些研究,您会注意到,大多数视图模型都实现了INotifyPropertyChanged 以进行更改跟踪。如果您想在用户修改 DataGrid 中的内容时做出反应,您的视图模型也可以实现此接口。

【讨论】:

    【解决方案2】:

    你可以使用 ListView - GridView

    <ListView ItemsSource="{Binding YourData}">
        <ListView.View>
            <GridView>
                <!-- The columns here -->
            </GridView>
        </ListView.View>
    </ListView>
    

    在您的代码中,您将创建一个属性(或您喜欢的),它是IEnumerable,您可以使用它进行数据绑定。否则,您可以设置网格的Datasource 属性。

    【讨论】:

      猜你喜欢
      • 2020-11-17
      • 1970-01-01
      • 2013-11-02
      • 2013-12-19
      • 2014-09-26
      • 1970-01-01
      • 1970-01-01
      • 2011-06-15
      • 1970-01-01
      相关资源
      最近更新 更多