为了解决这个问题,我试图了解DataGridView / BindingSource / DataRelation等。我已经阅读了一些教程并收集了有关该主题的信息。到目前为止,我认为我理解了基础知识,现在我正在尝试研究我学到的东西。
到目前为止,我正在使用本教程中的代码: https://msdn.microsoft.com/en-us/library/c12c1kx4%28v=vs.110%29.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1
在我的项目中有3个表:
Table A
A_id eng_word
0 dog
1 cat
Table B
B_id ger_word
0 Hund
1 Katze
2 Maus
Table C (Relation)
A_id B_id
0 0
0 1
1 1
1 2
我的目标是每个表A和表B都有BindingSource和DataRelations的DataGridViews,所以当我从DataGridView A点击一个条目时,会显示表B中的所有元素,这可能是可能是根据表C的翻译。
DataRelation relation = new DataRelation("Relation",
data.Tables["tableA"].Columns["A_id"],
data.Tables["tableB"].Columns["B_id"]);
data.Relations.Add(relation);
bindingSourceA.DataSource = data;
bindingSourceA.DataMember = "tableA";
bindingSourceB.DataSource = bindingSourceA;
bindingSourceB.DataMember = "Relation";
这显然无法在表B中调用表B中的连接,但我认为可以使用DataRelation和BindingSource。表A和表C之间的关系不是问题,但对表B来说似乎不可能。
有没有任何方法可以实现我的目标,或者这样只是错误?任何有关正确方向的建议或指示都会很高兴。
答案 0 :(得分:0)
如所请求的一个如何影响命令构建器的示例,因此它构建了对myTable的更新而不是myView或连接表。
变量Table是实际的DataTable,其中填充了“select * from myView”或“select B.field1,C.field2 from B join C on ...”
确保myTable中的每个字段都出现在myView中
using (SqlConnection connection = new SqlConnection(_ConnectionString))
{
connection.Open();
using (SqlDataAdapter adapter = new SqlDataAdapter())
{
using (SqlCommand command = new SqlCommand())
{
using (SqlCommandBuilder builder = new SqlCommandBuilder())
{
adapter.SelectCommand = command;// Command;
adapter.SelectCommand.Connection = connection;
builder.DataAdapter = adapter;
// here I let the command builder think that the table is myTable in stead of myView
adapter.SelectCommand.CommandText = "select * from myTable";
adapter.UpdateCommand = builder.GetUpdateCommand(true).Clone();
adapter.DeleteCommand = builder.GetDeleteCommand(true).Clone();
adapter.Update(Table);
}
}
}
}