1

我正在制作一个有 DataGridView 的程序。此 GridView 通过 SQL 连接通过 1 个表获取其数据。该表有 1 列和一些行。

对于每一行,都有另一列带有按钮。当我单击该按钮时,我希望它打开另一个表单,该表单仅显示我现在单击的行中的文件名。

不幸的是,程序打开了表单,但显示了表格中的第一个单元格。这是因为 Form2 从未被告知它应该从 Form1 获得的 e.RowIndex 编号,因此它知道要显示哪一行。所以现在它假设无论我点击哪个按钮,我都想要 e.RowIndex 编号 0,它指的是单元格编号 1。

所以,关于这个问题;如何让它在假设它只是 0 之前更新我的 chartRowNumber?

表格一:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Data.Sql;
using System.Threading;

namespace WindowsFormsApplication5
{
    public partial class Form1 : Form
    {![enter image description here][1]
    DataTable userTable = new DataTable();
    DataGridViewButtonColumn checkMeasurement = new DataGridViewButtonColumn();
    public DataSet ds = new DataSet();
    private SqlConnection con = new SqlConnection(@"Data Source=irrelevant");
    public Form1()
    {
        InitializeComponent();
        con.Open();
        SqlCommand cmd = new SqlCommand("SELECT BlobFilename FROM tblUsers", con);
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        da.Fill(ds);
        checkMeasurement.HeaderText = "Se Måling";
        checkMeasurement.Text = "";
        checkMeasurement.UseColumnTextForButtonValue = true;
        dataGridView1.DataSource = ds.Tables[0];
        dataGridView1.Columns.Add(checkMeasurement);
    }

    public void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {
        if (e.ColumnIndex == 0)
        {
            Form2 f = new Form2();
            f.chartRowNumber = e.RowIndex;
            Thread.Sleep(1000);
            f.Show();
        }
    }
}

}

表格 2

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication5
{
    public partial class Form2 : Form
    {
        public int chartRowNumber;
        public Form2()
        {
            InitializeComponent();
            Form1 f = new Form1();
            DataTable PatientTable = f.ds.Tables[0];
            listBox1.Items.Add(PatientTable.Rows[chartRowNumber].ItemArray[0].ToString());
        }
    }
}

如果您有兴趣,这是 GUI 的图片。 http://i.stack.imgur.com/PDyFt.png

4

2 回答 2

1

为 Form2 创建一个接受行号的重载构造函数

public int chartRowNumber = 0;
    public Form2()
    {
        InitializeComponent();
        Form1 f = new Form1();
        DataTable PatientTable = f.ds.Tables[0];
        listBox1.Items.Add(PatientTable.Rows[chartRowNumber].ItemArray[0].ToString());
    }

public Form2(int rowIndex)
    {
        InitializeComponent();
        Form1 f = new Form1();
        DataTable PatientTable = f.ds.Tables[rowIndex];
        listBox1.Items.Add(PatientTable.Rows[chartRowNumber].ItemArray[0].ToString());
    }

您将不得不检查此索引,因为我不确定您想在哪里使用该rowIndex变量,但您可以使用此方法将其获取到Form2实例

于 2013-11-11T20:11:57.003 回答
0

您的代码无法工作有两个原因。第一个是因为 Form2 的构造函数在您传递 rowIndex 之前运行,第二个原因是因为您构建了另一个 Form1 实例来提取数据表。第二个实例有自己的gridview,Form1 的构造函数重新查询数据库并填充第二个form1 实例的gridview。在这种情况下,事件 dataGridView1_CellContentClick 永远不会触发,并且您没有任何不同于零的 rowIndex

在 CellContentClick 事件中,您需要将 rowIndex 和构造函数内所需的表都传递给 Form2 构造函数

public void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
    if (e.ColumnIndex == 0)
    {
        Form2 f = new Form2(e.RowIndex, ds.Tables[0]);
        f.Show();
    }
}

在 Form2 构造函数中,您使用从 Form1 的当前实例传递的两个变量,而无需构建另一个实例

public partial class Form2 : Form
{
    public Form2(int chartRowNumber, DataTable form1Table)
    {
        InitializeComponent();
        listBox1.Items.Add(form1Table.Rows[chartRowNumber].ItemArray[0].ToString());
    }
}

当然,如果您需要保留这些变量以进行其他操作,您应该将它们保存在 Form2 当前实例内的全局变量中

相反,如果在 form2 内部,您既不需要 rowNumber 也不需要数据表,那么您可以直接从 Form1 的当前实例传递 item 数组的元素零

public void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
    if (e.ColumnIndex == 0)
    {
        Form2 f = new Form2(ds.Tables[0].Rows[e.RowIndex][0].ToString());
        f.Show();
    }
}

public partial class Form2 : Form
{
    public Form2(string item)
    {
        InitializeComponent();
        listBox1.Items.Add(item);
    }
}
于 2013-11-11T20:21:04.960 回答