我有一个要在 DataGridView 中显示的数据库表。但是,它有几个外键,我不想向用户显示代表另一个表的整数。
我有这个带有 userId 列的 DataTable 我有另一个带有列 id 和列用户名的 DataTable
我希望 DataGridView 在 userId = id 的位置显示用户名而不是 userId。
我怎样才能做到这一点?我还必须在要显示的同一个表中的多个列上执行此操作。
编辑:Windows 窗体,而不是 Web 窗体。
我有一个要在 DataGridView 中显示的数据库表。但是,它有几个外键,我不想向用户显示代表另一个表的整数。
我有这个带有 userId 列的 DataTable 我有另一个带有列 id 和列用户名的 DataTable
我希望 DataGridView 在 userId = id 的位置显示用户名而不是 userId。
我怎样才能做到这一点?我还必须在要显示的同一个表中的多个列上执行此操作。
编辑:Windows 窗体,而不是 Web 窗体。
这里有几个可供考虑的选择...
1 - 如果您有权访问数据库,请创建一个返回“非规范化”数据的视图或存储过程。然后,您可以将 GridView 直接绑定到此,一切都完成了。
2 - 为您需要检索的那些字段创建模板列。然后在 GridView 的 RowDatabound 事件中,您可以通过编程方式调用并获取适当的查找信息并将其显示在指定的列中。您的代码将如下所示:
protected void FormatGridView(object sender, System.Web.UI.WebControls.GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
e.Row.Cells[1].Text = GetUserId(Convert.ToInt32(DataBinder.Eval(e.Row.DataItem, "userid"));
}
}
你是如何填充数据表的?您可以为 DataAdapter 的 .SelectCommand 指定带有连接和适当列的自定义 SQL,或者在 xxxCommand 对象的 .CommandText 中指定自定义 SQL。
例如
myAdapter.SelectCommand = "Select a.column1, a.column2, b.username from tablea a inner join tableb b on b.userid = a.userId"
或者
myCommand.CommandType = Text;
myCommand.CommandText = ""Select a.column1, a.column2, b.username from tablea a inner join tableb b on b.userid = a.userId";
或者如前所述,您可以在数据库中创建一个视图或存储过程并调用它。
您可以创建一个存储过程来进行所需的连接以获取用户的名称或您需要的任何字段,并将其映射到具有此信息的类并将 datagridView 绑定到List<YourClass>
你用的是linq吗?
因为如果您使用的是 Linq,则可以将列的 DataPropertyName 设置为“User.UserName”,前提是您已在设计器中设置了正确的关联。
您可以将 DataGridView 绑定到可以包含一个或多个数据表的 DataSet。第一个数据表可以使用包含 userid 列的 SELECT 语句填充。第二个数据表可以包含用户名和 ID。然后添加一个关系到数据集的关系集合,它将第一个表的用户 ID 映射到第二个表的 ID。使用数据集,创建一个新的默认视图管理器,它只显示用户名而不显示用户 ID。将 DataGridView 的数据源设置为数据集的 DefaultViewManager。