Полагаю, после просмотра предыдущего дубликата, это может быть то, что вы ищете. Это может помочь вам, если вы объяснили общую картину, как это выглядит странным образом, поскольку данные уже находятся в сетке, и пользователь может их редактировать, я не уверен, почему вы должны «дублировать» эти данные на панели .
Однако, похоже, вы хотите, чтобы текстовые поля соответствовали текущей «выбранной» строке в сетке. Таким образом, будет одно текстовое поле для каждого столбца в сетке. Изначально вы знаете, сколько столбцов могут содержать данные. Следовательно, вам нужно динамически создавать текстовые поля на панели.
Один из подходов, чтобы «привязать» каждое текстовое поле к столбцу текущей выбранной строки в сетке, можно осуществить, «привязав» каждое текстовое поле к определенному столбец в 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;
}
Надеюсь, это поможет.