機能しない理由はわかりませんが、テストの実行からわかる限り、データがどのようにバインドされているかを処理する必要があります。使用するdataGridView1.DataSource = GetDataSource();
と、私のテストでは機能しませんでした。自動バインディングのいくつかの欠点について読んだことがありますが、見つけられませんでした。これが機能するコードです。行は、ユーザーが対応する行EditMode
のボタンをクリックした後にのみ表示されます。Edit
後で戻ってきます - さらにポインタが必要な場合はお知らせください。
public partial class Form1 : Form
{
int rowIndexOfEditableRow = -1;
public Form1() {
InitializeComponent();
CreateDataGridView(dataGridView1);
SetExistingDataGridViewRowsReadOnly();
this.dataGridView1.Columns.Add(GetBtnColumn());
}
private void SetExistingDataGridViewRowsReadOnly() {
DataGridViewRowCollection rows = this.dataGridView1.Rows;
foreach (DataGridViewRow row in rows) {
row.ReadOnly = true;
}
}
グリッドを手動で埋める必要があるようです - 少なくともこの方法で ReadOnly の変更が機能します
public void CreateDataGridView(DataGridView dgv)
{
dgv.ColumnCount = 3;
dgv.Columns[0].Name = "Id";
dgv.Columns[1].Name = "Lastname";
dgv.Columns[2].Name = "City";
dgv.BackgroundColor = Color.Gray;
AddRowsToDataGridView(dgv);
}
private void AddRowsToDataGridView(DataGridView dgv)
{
string[] row1 = new string[]{"1", "Muller", "Seattle"};
string[] row2 = new string[]{"2", "Arkan", "Austin"};
string[] row3 = new string[]{"3", "Cooper", "New York"};
object[] rows = new object[] { row1, row2, row3 };
foreach (string[] rowArray in rows)
{
dgv.Rows.Add(rowArray);
}
}
ボタン付きの列を作成するヘルパー メソッド
public DataGridViewButtonColumn GetBtnColumn()
{
DataGridViewButtonColumn btnColumn = new DataGridViewButtonColumn();
btnColumn.HeaderText = "Edit";
btnColumn.Text = "Edit";
btnColumn.UseColumnTextForButtonValue = true;
return btnColumn;
}
イベント ハンドラーは、ユーザーが編集ボタンをクリックしたかどうかを確認します。この場合、現在の行は に設定されReadOnly = false
ます。これにより、ユーザーは行を編集できます。それを強調するために、行の背景色を変更しました。
private void DataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
int colIndex = e.ColumnIndex;
int rowIndex = e.RowIndex;
Type cellType = dataGridView1.Columns[colIndex].CellType;
if (cellType == typeof(DataGridViewButtonCell))
{
dataGridView1.Rows[rowIndex].ReadOnly = false;
dataGridView1.Rows[rowIndex].DefaultCellStyle.BackColor = Color.GreenYellow;
this.rowIndexOfEditableRow = rowIndex;
label1.Text = rowIndexOfEditableRow.ToString() + " " + colIndex.ToString();
}
}
Row-leave-Event が発生すると、スタイルがリセットされ、行が編集可能なグローバル パラメータが初期値に設定されます。
private void DataGridView1_RowLeave(object sender, DataGridViewCellEventArgs e)
{
int rowIndex = e.RowIndex;
dataGridView1.Rows[rowIndex].ReadOnly = true;
dataGridView1.Rows[rowIndex].DefaultCellStyle.BackColor = Color.White;
this.rowIndexOfEditableRow = -1;
}
}
上記のコードには、このデモを作成するために必要なすべて (デザイナー ファイルを除く) が含まれています。
