从某种意义上说,您的问题有些令人困惑,因为尚不清楚最初是如何设置网格的。查看上一个问题的链接,我不确定“为什么”数据绑定网格会有所作为。从整体角度来看,将各个行设为只读似乎很奇怪。换句话说,如果表格加载时表格是只读的,那么无论数据源如何,所有行都是只读的。
因此,与其将“单个”行设置为只读,我猜“可能”简单地将“整个”网格设置为只读更容易。如果您像链接那样连接网格RowLeave 事件,这将起作用。
例如,整个网格是只读的,用户不能对单元格进行更改,然后用户单击其中一行中的“编辑”按钮。发生这种情况时,我们为单击“编辑”按钮所在的行设置行颜色,以直观地向用户显示该行已准备好进行编辑。然后将网格只读属性设置为 false。显然,这将允许用户此时“编辑”网格中的任何单元格,但是,如果我们将网格只读属性设置回 true,则连接网格 RowLeave 事件将防止这种情况发生。
此代码相对简单...注意:InEditMode1 变量用于了解是否正在编辑行,并避免在当前没有行正在编辑时不必要地重新设置网格只读属性.
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;
}
}
我希望这会有所帮助。