Ваш вопрос несколько сбивает с толку в том смысле, что неясно, как изначально настроена сеткаГлядя на ссылку на предыдущий вопрос, я не уверен, «почему» привязанная к данным сетка будет иметь значение.С общей точки зрения кажется странным делать отдельные строки доступными только для чтения.Другими словами, если сетка читается только при загрузке формы, тогда ВСЕ строки читаются только для чтения независимо от источника данных.
Поэтому вместо установки «отдельной» строки только для чтения, я предполагаю,«может быть» проще просто установить «целую» сетку только для чтения.Это будет работать, если вы подключите событие grid RowLeave
, как это делает ссылка.
Пример: вся сетка доступна только для чтения и пользователь не может вносить изменения в ячейки, затем пользователь нажимает «Изменить»кнопка в одном из рядов.Когда это происходит, мы устанавливаем цвет строки для этой строки, по которой нажимается кнопка «Изменить», чтобы визуально показать пользователю, что строка готова к редактированию.Затем установите для свойства grid только для чтения значение false.Очевидно, что это позволит пользователю «редактировать» ЛЮБУЮ ячейку в сетке на этом этапе, однако, связывание события grid RowLeave
предотвратит это, если мы установим свойство только для чтения в гриды обратно в true.
Код для этого относительно прост ... Примечание: переменная InEditMode1
используется, чтобы узнать, редактируется ли строка, и избежать ненужной переустановки свойства grid только для чтения, когда в данный момент не редактируется ни одна строка,
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) {
if (dataGridView1.Columns[e.ColumnIndex].Name == "Edit") {
dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.GreenYellow;
dataGridView1.ReadOnly = false;
InEditMode1 = true;
}
}
private void dataGridView1_RowLeave(object sender, DataGridViewCellEventArgs e) {
if (InEditMode1) {
dataGridView1.ReadOnly = true;
dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.White;
InEditMode1 = false;
}
}
Перетаскивание сетки на новую форму и использование приведенного ниже кода для добавления столбцов и некоторых данных должно позволить проверить это.
public void CreateDataGridView() {
dataGridView1.Columns.Add("Id", "Id");
dataGridView1.Columns.Add("Lastname", "Lastname");
dataGridView1.Columns.Add("City", "City");
dataGridView1.Columns.Add(GetBtnColumn());
dataGridView1.Rows.Add("1", "Muller", "Seattle");
dataGridView1.Rows.Add("2", "Arkan", "Austin");
dataGridView1.Rows.Add( "3", "Cooper", "New York");
}
Далее приведен пример использованияDataSource
для сетки.В этом примере DataTable
используется как DataSource
для сетки.Кроме того, добавлен столбец «Редактировать» Button
ПОСЛЕ того, как сетка DataSource
была установлена.Событие загрузки форм может выглядеть следующим образом…
private void Form2_Load(object sender, EventArgs e) {
DataTable GridTable = GetDataTable();
FillDataTable(GridTable);
dataGridView2.DataSource = GridTable;
dataGridView2.Columns.Add(GetBtnColumn());
}
Для тестирования…
public DataTable GetDataTable() {
DataTable dt = new DataTable();
dt.Columns.Add("Id", typeof(string));
dt.Columns.Add("LastName", typeof(string));
dt.Columns.Add("City", typeof(string));
return dt;
}
private void FillDataTable(DataTable dt) {
dt.Rows.Add("1", "Muller", "Seattle");
dt.Rows.Add("2", "Arkan", "Austin");
dt.Rows.Add("3", "Cooper", "New York");
}
public DataGridViewButtonColumn GetBtnColumn() {
DataGridViewButtonColumn btnColumn = new DataGridViewButtonColumn();
btnColumn.Name = "Edit";
btnColumn.HeaderText = "Edit";
btnColumn.Text = "Edit";
btnColumn.UseColumnTextForButtonValue = true;
return btnColumn;
}
Обратите внимание, что код для этого - тот же самый код в сетке NON-DataBound выше.
private void dataGridView2_CellClick(object sender, DataGridViewCellEventArgs e) {
if (dataGridView2.Columns[e.ColumnIndex].Name == "Edit") {
dataGridView2.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.GreenYellow;
dataGridView2.ReadOnly = false;
InEditMode2 = true;
}
}
private void dataGridView2_RowLeave(object sender, DataGridViewCellEventArgs e) {
if (InEditMode2) {
dataGridView2.ReadOnly = true;
dataGridView2.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.White;
InEditMode2 = false;
}
}
Надеюсь, это поможет.