如何创建和绑定GridView,其中列由数据库表确定?

时间:2017-07-13 18:57:45

标签: c# wpf mvvm

我想创建一个GridView(最好是telerik),根据数据库中的行生成和绑定列。网格应如下所示: enter image description here

以下是数据库设置的示例。 我有3个数据库表如下:

员工 - 员工姓名列表

国家 - 国家清单

EmployeeStates-连接表,其中包含EmployeeID,StateID和boolean for checked或unchecked。

可以将新行添加到两个数据库表中,以便员工列表和城市列表变得更长。 如何将其绑定到GridView?

3 个答案:

答案 0 :(得分:1)

不知道你是否还有这个问题,但我们一段时间后就解决了。这不是直截了当的,但可以做到。我们的表格用于治疗部位(身体部位)和治疗类型,我们希望显示一个网格,显示所有可能的部位,以及为相关患者勾选的部分。

获取数据的服务器端查询看起来像这样......

int systemID = 210;
var cross = TreatmentSites.Select(ts => new {
  TreatmentSiteID = ts.ID,
  TreatmentSiteName = ts.Description,
  Checked = string
    .Join("", TreatmentCheckTypes
              .OrderBy(tct => tct.ID)
              .Select(cs => SystemTreatmentSitesCheckeds
                .Any(s => s.Active
                       && s.SystemID == systemID
                       && s.TreatmentSiteID == ts.ID
                       && s.TreatmentCheckTypeID == cs.ID) ? "y" : "n"))
})
.ToArray();

这提取了一个网站列表,其中包含nnyyn形式的字符串,用于检查的类型。

Nest的工作就是把它按到可以被WPF使用的东西上。为此,我们使用了以下代码......

Dictionary<String, dynamic>[] data = new Dictionary<string, dynamic>[cross.Count()];
for (int crossN = 0; crossN < cross.Count(); crossN++) {
  var d = new Dictionary<String, dynamic>();
  d["TreatmentSiteID"] = cross[crossN].TreatmentSiteID;
  d["TreatmentSiteName"] = cross[crossN].TreatmentSiteName;
  for (int checktypeN = 0; checktypeN < treatmentCheckTypes.Count(); checktypeN++) {
    d["C" + checktypeN] = cross[crossN].Checked[checktypeN] == 'y';
  }
  data[crossN] = d;
}

这给了我们所需的数据。有了它,WPF视图能够在代码中向网格添加列,然后将数据绑定到网格。

以上是基本思路。有关其工作原理的更多详细信息可以是found on my blog

希望有所帮助。

答案 1 :(得分:0)

如果你遵循这个link你应该有足够的例子来获得一些想法。想一想WPF telerik组件。

答案 2 :(得分:0)

您可以将ItemsSource的{​​{1}}属性设置或绑定到RadGridView,其中IEnumerable<YourType>是一个包含Employee,NJ,PA,RI和纽约物业。

YourType的{​​{1}}。

您必须编写一个SQL查询,从数据库中选择适当的数据,然后为每个返回的记录创建DataView的实例,或直接使用DataTable。有很多关于如何与在线提供的数据库进行通信的示例:https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldataadapter(v=vs.110).aspx