You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows Forms C#使用WHERE子句查询SQL数据显示异常求助

解决新窗体总是显示第一行数据的问题

嘿,我明白你的问题了——你已经写出了查询指定项目的代码,但新窗体没拿到你筛选好的数据,所以它还是在显示整个表的第一行。咱们一步步来修复这个问题:

核心问题所在

你在按钮点击事件里确实查询到了P3890T对应的记录并填充到了DataTable,但你没把这个筛选后的DataTable传递给新窗体TRACK_10_PI。新窗体大概率是直接绑定了整个Project_Info表的数据源,自然只会显示第一行数据。

步骤1:给新窗体加个接收数据的入口

我们需要让TRACK_10_PI能接收你传过去的筛选后的数据,有两种简单方式:

方式一:添加公共属性

在TRACK_10_PI的代码里加一个公共属性:

// 放在TRACK_10_PI类里
public DataTable CustomerDetails { get; set; }

方式二:重载构造函数(更推荐)

直接在创建新窗体的时候把数据传进去:

// TRACK_10_PI类的构造函数
public TRACK_10_PI(DataTable customerData)
{
    InitializeComponent();
    // 把接收的数据存起来
    CustomerDetails = customerData;
}
// 别忘了保留默认的无参构造函数,不然设计器可能出问题
public TRACK_10_PI()
{
    InitializeComponent();
}

然后在新窗体的Load事件里,把数据绑定到你的控件上:

private void TRACK_10_PI_Load(object sender, EventArgs e)
{
    // 如果用DataGridView展示所有字段
    if (CustomerDetails != null)
    {
        dataGridView1.DataSource = CustomerDetails;
    }

    // 如果是用单个文本框展示具体字段(比如只显示联系人和地址)
    if (CustomerDetails?.Rows.Count > 0)
    {
        var row = CustomerDetails.Rows[0];
        txtProjectID.Text = row["Project"].ToString();
        txtContactPerson.Text = row["ContactPerson"].ToString();
        txtAddress.Text = row["Address"].ToString();
        // 其他字段照着这个格式加就行
    }
}

步骤2:修改按钮点击事件的代码

现在要把筛选好的DataTable传递给新窗体,另外还要注意数据库连接的资源释放——用using语句会自动帮你关闭连接,避免内存泄漏:

private void button2_Click(object sender, EventArgs e)
{
    // 用using包裹连接和适配器,自动释放资源
    using (SqlConnection con = new SqlConnection("Data Source=WIN-M9TBGRD70BU;Initial Catalog=Disk_Tracker;User ID=Tracker;Password=********"))
    {
        // 这里的查询语句可以后续改成动态获取当前选中的项目ID,不用写死P3890T
        string query = "SELECT * FROM Project_Info WHERE Project = 'P3890T'";
        using (SqlDataAdapter sda = new SqlDataAdapter(query, con))
        {
            DataTable dt = new DataTable();
            sda.Fill(dt);

            // 处理查询无结果的情况,给用户提示
            if (dt.Rows.Count == 0)
            {
                MessageBox.Show("没有找到该项目的详情数据!");
                return;
            }

            this.Hide();
            // 把DataTable传给新窗体,这里用构造函数的方式
            TRACK_10_PI T10 = new TRACK_10_PI(dt);
            // 如果用公共属性的话:
            // TRACK_10_PI T10 = new TRACK_10_PI();
            // T10.CustomerDetails = dt;
            T10.Show();
        }
    }
}

额外的优化小建议

  • 不要硬编码项目ID:如果这个P3890T是当前窗体选中的项目,从当前控件(比如DataGridView的选中行)获取会更灵活,比如:
    // 假设当前窗体有个DataGridView叫dgvProjects
    string selectedProject = dgvProjects.SelectedRows[0]["Project"].ToString();
    
  • 用参数化查询防SQL注入:直接拼接字符串容易有安全问题,改成参数化的方式更安全:
    string query = "SELECT * FROM Project_Info WHERE Project = @ProjectID";
    using (SqlDataAdapter sda = new SqlDataAdapter(query, con))
    {
        // 添加参数
        sda.SelectCommand.Parameters.AddWithValue("@ProjectID", selectedProject);
        sda.Fill(dt);
    }
    

这样修改之后,新窗体就能准确显示你指定项目的客户联系详情了!

内容的提问来源于stack exchange,提问作者N41H4N

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:31:56