DataSet主从数据绑定存在子表却找不到parameter表的问题
解决DataSet主从DataGridView绑定的DataMember找不到问题
问题重现
源XML结构:
<restcommands> <command classname="org.openas2.cmd.processor.restapi" name="clearconsole" method="post" path="/v2/ClearConsole"> <parameter name="OneDummy" type="string"/> <parameter name="TwoDummy" type="string"/> </command> <command classname="org.openas2.cmd.processor.restapi" name="writetoconsole" method="post" path="/v2/WriteToConsole"> <parameter name="textToWrite" type="string"/> </command> <command classname="org.openas2.cmd.processor.restapi" name="listpartnership" method="get" path="/partnership/list"> <parameter name="pathprefix" type="string"/> </command> </restcommands>
尝试绑定的代码:
DataSet restDs = new DataSet(); restDs.ReadXml(new StringReader(restxml)); // Set up bindings for the master DataGridView (commands) masterBindingSource.DataSource = restDs; masterBindingSource.DataMember = "command"; dgvRestCommands.DataSource = masterBindingSource; DataTable parameterTable = restDs.Tables["command"].ChildRelations[0].ChildTable; detailsBindingSource.DataSource = masterBindingSource; detailsBindingSource.DataMember = parameterTable.TableName; dgvRestCommandParameters.DataSource = masterBindingSource;
运行时报错:
'DataMember property 'parameter' cannot be found on the DataSource.'
问题原因
- DataMember指定错误:DataSet通过
ReadXml读取嵌套XML时,会自动生成父表与子表的DataRelation,子表绑定需要指定的是关系名称而非子表TableName。DataSet自动生成的关系名通常为父表名_子表名(例如此处为command_parameter),直接用子表名parameter无法被识别。 - 细节DataGridView数据源绑定错误:最后一行代码将细节DataGridView绑定到了
masterBindingSource,应该绑定到detailsBindingSource才能关联主表选中行的子数据。
解决方案
修正后的代码如下:
DataSet restDs = new DataSet(); restDs.ReadXml(new StringReader(restxml)); // 主表DataGridView绑定 masterBindingSource.DataSource = restDs; masterBindingSource.DataMember = "command"; dgvRestCommands.DataSource = masterBindingSource; // 获取父表与子表的关系名称(而非子表名) string childRelationName = restDs.Tables["command"].ChildRelations[0].Name; // 子表BindingSource绑定 detailsBindingSource.DataSource = masterBindingSource; detailsBindingSource.DataMember = childRelationName; // 细节DataGridView绑定到子表BindingSource dgvRestCommandParameters.DataSource = detailsBindingSource;
额外说明
- 若不确定关系名称,可通过调试查看
restDs.Relations集合,或在代码中打印确认:Console.WriteLine(restDs.Relations[0].Name); - 也可手动创建
DataRelation指定自定义名称,避免依赖自动生成的名称,示例如下:
// 手动创建关系(可选) if (restDs.Relations.Contains("CommandToParameter")) restDs.Relations.Remove("CommandToParameter"); DataRelation relation = new DataRelation( "CommandToParameter", restDs.Tables["command"].Columns["command_Id"], // DataSet自动生成的父表主键列 restDs.Tables["parameter"].Columns["command_Id"] // 自动生成的外键列 ); restDs.Relations.Add(relation); // 绑定子表时使用自定义关系名 detailsBindingSource.DataMember = "CommandToParameter";
内容的提问来源于stack exchange,提问作者TonyP
相关产品推荐
相关产品推荐

