WinForms – DataGridView 列を編集できません

問題

DataGridView を使用していて、1 つ以上の列を編集できません。セルをクリックすると、強調表示されるだけで、編集モードにはなりません。

グリッド、列、またはバインドされたプロパティが読み取り専用かどうかを確認してください。これらのいずれかが読み取り専用の場合、列の値を編集できません。

解決策

ケース 1 – DataGridView は読み取り専用です

最初に行うことは、グリッドが読み取り専用かどうかを確認することです。読み取り専用の場合、どの列も編集できません。グリッドの ReadOnly プロパティを false に設定します。

注:[編集を有効にする] をオンにしても同じことが行われます (ReadOnly プロパティにリンクされます)。

問題がないように見える場合は、コードがプログラムで ReadOnly をどこかに設定しているかどうかを確認してください。

ケース 2 – 列が読み取り専用

(列が自動的に生成されるのではなく) UI を介して手動で、またはプログラムによって列を追加した場合は、列が読み取り専用かどうかを確認します。列の ReadOnly プロパティを false に設定します。

コードをチェックして、ReadOnly プロパティをどこかに設定しているかどうかを確認してください。

ケース 3 – 列がパブリックでないセッターを持つプロパティにバインドされている

列を編集可能にするには、パブリック セッターを使用してプロパティにバインドする必要があります。プロパティに公開されていないセッターがある場合、効果的に列を読み取り専用にします。

これが例です。レシピのリストにバインドしていて、Recipe クラスに次の定義があるとしましょう:

public class Recipe
{
	public string Name { get; set; }
	public int Meals { get; internal set; }
}
Code language: C# (cs)

Meals プロパティには非公開のセッターがあります。したがって、[食事] 列は読み取り専用になり、編集できなくなります。セッターを公開する:

public class Recipe
{
	public string Name { get; set; }
	public int Meals { get; set; }
}
Code language: C# (cs)

ケース 4 – 一部のイベント ハンドラーが編集のコミットを妨げている

それでも列を編集できない場合は、編集を妨げているイベント ハンドラーがあるかどうかを確認してください。

これは、考えられる多くの例の 1 つにすぎません。条件付きで CancelEdit() を呼び出す次の CellValidating イベント ハンドラーがあるとします。

private void recipeGrid_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
        //some conditional logic
	recipeGrid.CancelEdit();
}
Code language: C# (cs)

条件付きロジックに問題があり、常に CancelEdit() が呼び出されるとします。このシナリオでは、新しい値を入力できますが、常に古い値に戻ります。つまり、編集モードに入ることができますが、編集することはできません。


No