Как добавить несколько TextBox, следуйте DataGridView.Columns.Count и столбцу data.TQ - PullRequest
0 голосов
/ 23 марта 2020
//...
{
    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. TQ?

add multiple textbox

1 Ответ

0 голосов
/ 24 марта 2020

Полагаю, после просмотра предыдущего дубликата, это может быть то, что вы ищете. Это может помочь вам, если вы объяснили общую картину, как это выглядит странным образом, поскольку данные уже находятся в сетке, и пользователь может их редактировать, я не уверен, почему вы должны «дублировать» эти данные на панели .

Однако, похоже, вы хотите, чтобы текстовые поля соответствовали текущей «выбранной» строке в сетке. Таким образом, будет одно текстовое поле для каждого столбца в сетке. Изначально вы знаете, сколько столбцов могут содержать данные. Следовательно, вам нужно динамически создавать текстовые поля на панели.

Один из подходов, чтобы «привязать» каждое текстовое поле к столбцу текущей выбранной строки в сетке, можно осуществить, «привязав» каждое текстовое поле к определенному столбец в DataTable, который используется как DataSource для сетки. Каждое текстовое поле имеет свойство с именем… DataBindings. Это свойство позволит вам «привязать» текстовое поле к определенному столбцу в DataTable. Ниже приведен пример.

Чтобы помочь, учитывая, что у нас есть данные, я предлагаю метод AddTextBoxesToPanel(DataTable dt)…, который принимает DataTable и перебирает столбцы этой таблицы и создает текстовое поле для каждого столбца И добавляет «связывание» для этого столбца в это текстовое поле. При таком подходе не требуется никакого дополнительного кода для заполнения текстовых полей, когда пользователь выбирает разные строки.

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;
  }
}

Выше мы предполагаем, что это может быть вызвано более одного раза, и необходимо «очистить» любой предыдущий текстовые поля в панели. Установите панель для прокрутки, затем введите l oop через столбцы, чтобы добавить текстовые поля на панель. Метод GetTextBox (ниже) просто получает новый TextBox с нужным местоположением. Наконец, мы устанавливаем DataBinding для текстового поля «тот», чтобы он указывал на «этот» столбец. 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, чтобы заполнить DataTable 10 столбцами и 20 строками, а затем использовать это 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;
}

Надеюсь, это поможет.

...