将LogicaLog类中DataTable绑定到DataGridView时为空如何解决
问题原因
- 你在
TablasLog窗体中实例化的LogicaLog对象r,从未执行过crear_trigger方法:tbl_tablas仅在crear_trigger方法运行时才会被数据库查询结果赋值,未调用该方法时这个成员变量默认值就是null。 - 如果你之前在其他业务逻辑中已经调用过
crear_trigger方法赋值了tbl_tablas,本质是你使用了另一个LogicaLog类的实例,不同实例的非静态成员变量数据互相独立,新实例的tbl_tablas自然还是未赋值的状态。
解决方法
方案1:独立封装tbl_tablas的加载逻辑(推荐)
原crear_trigger方法还包含创建触发器的业务逻辑,直接调用会额外执行不需要的操作,你可以把查询tblTablaLog的逻辑单独抽出来作为LogicaLog的公共方法:
// 在LogicaLog类中添加如下方法 public void CargarTablasLog() { tbl_tablas = Traer_informacion("SELECT TABLE_NAME,Activo FROM tblTablaLog WHERE Activo = 'True' ", set_getcadena_orginen); }
然后在TablasLog窗体的Load事件中先调用这个方法再绑定数据源:
private void TablasLog_Load(object sender, EventArgs e) { r.CargarTablasLog(); // 先加载数据 dataGridView1.AutoGenerateColumns = true; dataGridView1.DataSource = r.tbl_tablas; }
方案2:复用已经实例化过的LogicaLog对象
如果你是在其他窗口先执行了crear_trigger方法,再打开TablasLog窗口,可以把已经赋值过的LogicaLog实例通过构造函数传递给TablasLog窗口,避免重复实例化:
// 修改TablasLog的构造函数 public partial class TablasLog : Form { LogicaLog r; // 接收外部传入的已经赋值的LogicaLog实例 public TablasLog(LogicaLog logicaInstancia) { InitializeComponent(); r = logicaInstancia; } private void TablasLog_Load(object sender, EventArgs e) { dataGridView1.AutoGenerateColumns = true; dataGridView1.DataSource = r.tbl_tablas; } }
打开TablasLog窗口的位置传入已有的实例即可:
// 假设你之前的LogicaLog实例名为logicaExistente TablasLog form = new TablasLog(logicaExistente); form.Show();
方案3:临时测试方案
如果只是临时测试不需要优化逻辑,也可以直接调用crear_trigger方法,注意需要传入当前窗体作为参数:
private void TablasLog_Load(object sender, EventArgs e) { r.crear_trigger(this); // 调用方法赋值tbl_tablas dataGridView1.AutoGenerateColumns = true; dataGridView1.DataSource = r.tbl_tablas; }
注意:该方案会执行创建触发器的全部逻辑,仅适合测试场景使用,生产环境建议使用方案1
内容的提问来源于stack exchange,提问作者Esteban Giraldo
相关产品推荐
相关产品推荐

