如何添加多个文本框,后跟 DataGridView.Columns.Count 和列 data.TQ

How to add multiple TextBox follow by DataGridView.Columns.Count and column data.TQ

//...
{
    public Form1()
    {
        InitializeComponent();
        LoadData();
        textBoxFill();
    }

    private void LoadData()
    {
        SqlConnection SCConnect = new SqlConnection("Server=localhost;Initial Catalog=T8;Integrated Security=SSPI;");
        SCConnect.Open();
        StringBuilder SBBuilder = new StringBuilder("Select * from Table8");
        SqlDataAdapter SDA = new SqlDataAdapter(SBBuilder.ToString(), SCConnect);
        SqlCommandBuilder SCB = new SqlCommandBuilder(SDA);
        DataTable DT = new DataTable();
        SDA.Fill(DT);
        dataGridView1.DataSource = DT;
    }

    private void textBoxFill()
    {
        TextBox TB = new TextBox();
        int A = 1;
        for (int i = 0; i < dataGridView1.Columns.Count; i++)
        {
            panel1.Controls.Add(TB);
            TB.Location = new Point(10, (A * 20));
            TB.Top = A * 28;
            TB.Size = new Size(200, 50);
            TB.Margin = new Padding(10, 10, 10, 10);
        }
        A = A + 1;
    }
}

如何添加多个 TextBox 后跟 DataGridView.Columns.Count 和 每个 TextBox 填充每个 DataGridView 列 data.TQ?

我在查看之前的副本后猜测 post,这可能就是您要查找的内容。如果您解释了整体情况,这可能会对您有所帮助,因为这似乎是一件奇怪的事情,因为数据已经在网格中并且用户可以对其进行编辑,我不确定您为什么要在面板中“复制”此数据.

但是,您似乎确实希望文本框与网格中当前“选定”的行相对应。这样网格中的每一列都会有一个文本框。最初,您确实知道数据可能包含多少列。因此,您需要在面板中动态创建文本框。

一种将每个文本框“绑定”到网格中当前选定行的列的方法可以通过将每个文本框“绑定”到 DataTable 中用作 DataSource到网格。每个文本框都有一个名为...DataBindings 的属性。 属性 将允许您将文本框“绑定”到 DataTable 中的特定列。下面是一个例子。

为了提供帮助,鉴于我们有数据,我建议使用一种方法 AddTextBoxesToPanel(DataTable dt) ......它采用 DataTable 并循环遍历 table 的列并为每个列创建一个文本框列并将该列的“绑定”添加到该文本框。使用这种方法,当用户选择不同的行时,不需要额外的代码来填充文本框。

private void AddTextBoxesToPanel(DataTable dt) {
  panel1.Controls.Clear();
  panel1.AutoScroll = true;
  panel1.AutoScrollMinSize = new Size(0, (dt.Columns.Count * 23) + 15);
  TextBox curTB;
  int y = 10;
  foreach (DataColumn col in dt.Columns) {
    curTB = GetTextBox(10, y);
    curTB.DataBindings.Add(new Binding("Text", dt, col.ColumnName));
    panel1.Controls.Add(curTB);
    y += 23;
  }
}

以上,我们假设这可能被调用不止一次,并且需要“清除”面板中之前的所有文本框。将面板设置为可滚动,然后开始遍历列以将文本框添加到面板。 GetTextBox 方法(如下)简单地获取具有所需位置的新 TextBox。最后,我们将“that”文本框的 DataBinding 设置为指向“that”列。 curTB.DataBindings.Add(new Binding("Text", dt, col.ColumnName));

private TextBox GetTextBox(int xLoc, int yLoc) {
  TextBox TB = new TextBox {
    Text = "",
    Location = new Point(xLoc, yLoc),
    Size = new Size(150, 50),
    Margin = new Padding(10),
    Anchor = AnchorStyles.Left
  };
  return TB;
}

下面是使用上述方法的完整示例。 Forms Load 方法用 10 列和 20 行填充 DataTable,然后将该 DataTable 用作网格的 DataSource。然后调用上面的方法将文本框设置到面板中。

private void Form1_Load(object sender, EventArgs e) {
  FillGrid(10, 20);
  AddTextBoxesToPanel((DataTable)dataGridView1.DataSource);
}

一种生成测试数据的方法。

private void FillGrid(int totalColumns, int totRows) {
  DataTable dt = new DataTable();
  // add columns
  for (int i = 0; i < totalColumns; i++) {
    dt.Columns.Add("Col" + i, typeof(string));
  }
  // add rows
  object[] data = new object[totalColumns];
  for (int row = 0; row < totRows; row++) {
    for (int col = 0; col < totalColumns; col++) {
      data[col] = "Col" + col + "Row" + row;
    }
    dt.Rows.Add(data);
  }
  dataGridView1.DataSource = dt;
}

希望对您有所帮助。