【问题标题】:Filling two different datagridview with different tables from same DB用来自同一数据库的不同表填充两个不同的 datagridview
【发布时间】:2020-10-14 01:15:14
【问题描述】:

我正在使用 C# 和 SQL 开发一个兽医应用程序。当我可以访问客户端历史记录时,它会填满我的 pacient datagridview。我想知道如何在我选择了病人的行时从病人的数据网格视图中填充临床历史数据网格视图。已经将 ClearSelection() 从加载中取消选择任何患者,但我尝试进行 SelectedRow 事件,但诊所历史数据网格视图上没有任何反应。 如果需要,我可以稍后放代码或图片。

PS:临床病历表有外键链接到病人表。

编辑:这是我写的代码。 GetData 获取患者表,GetData2 获取临床历史表。

    private void GetData(string selectCommand)
    {
        try
        {
            dataAdapter = new SqlDataAdapter(selectCommand, connString);
            table = new DataTable();
            table.Locale = System.Globalization.CultureInfo.InvariantCulture;
            dataAdapter.Fill(table);
            bindingSource17.DataSource = table;
        }
        catch (SqlException ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
    private void GetData2(string selectCommand)
    {
        dataGridView3.DataSource = null;
        try
        {
            dataAdapter = new SqlDataAdapter(selectCommand, connString);
            table = new DataTable();
            table.Locale = System.Globalization.CultureInfo.InvariantCulture;
            dataAdapter.Fill(table);
            bindingSource18.DataSource = table;
        }
        catch (SqlException ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

//这是让我感到困惑的部分,因为 pacient 表完美地工作,但临床历史表却不是这样。以下适用于客户端搜索,它返回客户端拥有的 pacient

   private void button12_Click_1(object sender, EventArgs e)
    {
        Form7 Buscarcli = new Form7();
        Buscarcli.TransfEvent += frm_TransfEvent;
        Buscarcli.ShowDialog();
        dataGridView2.DataSource = bindingSource17;
        if (lblID.Text != null)
        {
            GetData("Select * from Pacientes where id_pacientes like '%" + lblID.Text + "%'");
        }
    }

//在这之后,Idk如何继续使它工作。 Bindingsource17 是用于患者的数据网格视图,Bindingsource18 相同,但用于临床历史。

非常感谢。 PS:我有几个星期的编码经验,如果看起来一团糟,很抱歉。我尽我所能。

【问题讨论】:

  • 请向我们提供一些代码,显示您的尝试。如果您还没有阅读,请花点时间阅读how to ask

标签: c# sql datagridview


【解决方案1】:

我很确定,这与您一直在做的事情完全不同。简单的方法是:

  • 向您的项目添加新数据集
  • 打开它,右击surface,选择“Add TableAdapter”,配置连接字符串
  • 添加类似SELECT * FROM Patient WHERE ID = @id 的查询
  • 完成向导,调用您的查询 FillById/GetDataById
  • 添加另一个查询;右键单击表格适配器,添加查询..SELECT * FROM Patient WHERE lastName LIKE @lastName - 或者您将搜索患者的任何内容
  • 称它为 FillByLastName(或其他)
  • 添加另一个表适配器 - SELECT * FROM ClinicHistory WHERE ID = @Id、FillById 等,完成
  • 给这个添加另一个wuery; SELECT * FROM ClinicHistory WHERE PatientID = @PatientID、FillByPatientId 等、完成等
  • 保存数据集
  • 切换到表单
  • 显示数据源窗口(查看菜单、其他窗口)
  • 将患者节点拖到表单上
  • 展开患者节点
  • 将 ClinicHistory(它是患者表节点的子节点不是它的对等节点)拖到表单上
  • 切换到代码,从工具条文本框中找到填充患者表的行,在其下添加以下行:
    clinicHistoryTableAdapter.ClearBeforeFill = false;
    foreach(PatientsRow ro in yourDataSetName.Patients)
      clinicHistoryTableAdapter.FillByPatientId(yourDataSetName.ClinicHistory, ro.Id);

并更改行本身,使其看起来更像:

patientsTableAdapter.FillByLastName(yourDataSetName.Patients, idToolStripTextBox.Text); //todo: rename that textbox

根据你的上下文调整名称(我猜的)

运行应用程序;将患者姓名放入顶部导航器(文本框)并单击“填充”。许多患者(希望如此)会加载。当您单击其中任何一个时,ClinicHistory 表会自动更新以显示相关数据

【讨论】:

  • 我已经上传了我写的代码。 pacient 列在 datagridview 中,不使用文本框进行搜索。无论如何,我会尽力帮助你给我的。非常感谢。
  • 在新项目中随意做;当你习惯它时,你会发现很容易让 VS 为你写很多代码(你写的所有代码,你都可以让 VS 来写它)。你可能没有通过文本框搜索..但这并不意味着你不能。如果你想加载所有记录,你可以在文本框中放一个 % (如果你的查询是用 LIKE 搜索的)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-05
相关资源
最近更新 更多