我有一个带有ListView的WPF用户控件,它基于传递给它的DataSet创建:
public void PopulateList(DataSet ds) {
listView.View = CreateGridViewColumns(ds.Tables[0]);
listData.DataContext = ds.Tables[0];
}
private GridView CreateGridViewColumns(DataTable dt) {
// Create the GridView
var gv = new GridView {AllowsColumnReorder = true};
// Create the GridView Columns
foreach (DataColumn item in dt.Columns) {
var gvc = new GridViewColumn
{
DisplayMemberBinding = new Binding(item.ColumnName),
Header = item.ColumnName,
Width = Double.NaN
};
gv.Columns.Add(gvc);
}
return gv;
}
现在我在代码中创建用户控件并使用适当的数据集调用它的PopulateList,这就是问题的起点:
如果我传入一个通过调用数据库创建的数据集,列表视图会显示所有数据,但如果我传入我在代码中创建的DataSet,则ListView会显示列,但不会显示数据
//This is a function that hides the DB call return type is DataSet
var dsPatientSmokingStatusHistory = DataRepository.PatientSmokingStatusProvider.GetHistory(PatientId);
//radGridViewPatientSmokingStatus.DataSource = dsPatientSmokingStatusHistory.Tables[0];
var dt = new DataTable();
string c1 = "Date".PadLeft(23).PadRight(23);
string c2 = "Status".PadLeft(20).PadRight(50);
dt.Columns.Add(c1);
dt.Columns.Add(c2);
int i = 0;
foreach (DataRow row in dsPatientSmokingStatusHistory.Tables[0].Rows) {
var dataRow = dt.NewRow();
dataRow[c1] = ((DateTime)row["Date"]).ToString("MM/dd/yyyy");
dataRow[c2] = row["Status"].ToString();
dt.Rows.Add(dataRow);
dt.Rows[i].AcceptChanges();
i++;
}
DataSet ds = new DataSet();
dt.TableName = "Table";
ds.Tables.Add(dt);
ds.AcceptChanges();
smokingStatusGrid.GridWidth = 455;
smokingStatusGrid.GridHight = 97;
//This line does not show data
smokingStatusGrid.PopulateGrid(ds);
//This line will show data
smokingStatusGrid.PopulateGrid(dsPatientSmokingStatusHistory);
我不知道这两个数据集之间有什么区别阻止我对它进行数据绑定吗?
此外,用户控件在WinForms应用程序中被用作ElementHost(不确定这是否有所不同)
答案 0 :(得分:0)
您的代码说:
DisplayMemberBinding = new Binding(item.ColumnName)
此binding constructor采用字符串参数,根据MSDN,“绑定”的初始Path,并且数据类型为System.Windows.PropertyPath。我想,因为系统试图在你的类中找到一个具有相同名称的属性,并且你的字符串(item.ColumnName)在开始时有空格,它会遇到问题(属性不能以空格开头)。
建议您在表格的列名中取消正在执行的填充。在GridView的标题中应用任何填充/边距。