C# WinForm如何将Npgsql(Postgres)数据绑定到DataGridView指定列?
解决DataGridView二次绑定自动替换预定义列的问题
问题根源在于DataGridView默认开启了AutoGenerateColumns自动生成列功能,每次绑定数据源时,它会根据DataTable的列结构自动创建新列,覆盖你手动定义的预定义列。只需两步即可解决:
1. 关闭自动生成列
在绑定数据源前,强制设置AutoGenerateColumns为false,确保仅使用你预先定义的列:
GVObj.AutoGenerateColumns = false;
2. 优化后的完整代码
同时建议用using语句管理数据库资源,避免连接泄漏;简化列映射的写法,直接使用列名字符串即可:
public static void GetUsers(DataGridView GVObj, DataGridViewColumn User_Name_GVC, DataGridViewColumn User_UserName_GVC, DataGridViewColumn User_Password_GVC, DataGridViewColumn User_PhoneNumber_GVC, DataGridViewColumn User_Address_GVC, DataGridViewColumn User_RoleID_GVC, DataGridViewColumn User_UserID_GVC) { try { string SQLqUery = "SELECT * FROM users;"; // 使用using自动释放命令资源 using (var CMD = new NpgsqlCommand(SQLqUery, Main.DbConnection)) { // 检查连接状态,避免重复打开 if (Main.DbConnection.State != System.Data.ConnectionState.Open) Main.DbConnection.Open(); DataTable dt = new DataTable(); dt.Load(CMD.ExecuteReader()); // 关键:关闭自动生成列 GVObj.AutoGenerateColumns = false; // 绑定预定义列与数据库列的映射 User_UserName_GVC.DataPropertyName = "UserName"; User_Password_GVC.DataPropertyName = "Password"; User_PhoneNumber_GVC.DataPropertyName = "PhoneNumber"; User_Address_GVC.DataPropertyName = "Address"; User_RoleID_GVC.DataPropertyName = "RoleFK"; User_UserID_GVC.DataPropertyName = "UserId"; User_Name_GVC.DataPropertyName = "Name"; GVObj.DataSource = dt; } } catch (Exception ex) { // 确保异常时关闭连接 if (Main.DbConnection.State == System.Data.ConnectionState.Open) Main.DbConnection.Close(); MessageBox.Show(ex.Message, "Error"); } }
额外提示
- 无需通过
dt.Columns["ColumnName"].ToString()获取列名,直接写数据库列名字符串更简洁高效。 using语句会自动处理NpgsqlCommand的资源释放,避免内存泄漏问题。
内容的提问来源于stack exchange,提问作者Arslan Anjum
相关产品推荐
相关产品推荐

