ReadOnlyに設定されていないDataGridViewがあります。その列はいずれもReadOnlyに設定されておらず、バインドされているオブジェクトはReadOnlyに設定されていません。それでも、DataGridViewアイテムを編集できませんか?DataGridViewの.DataSourceプロパティはReadOnlyCollection<>に設定されていますが、UIからではなく、プログラムで要素を変更できます。どうしたの?
7 に答える
DataGridViewがReadOnlyCollectionにバインドされている場合、コレクション内の任意のアイテムをプログラムで編集できても、DataGridViewによって値の変更が制限されることがわかります。この動作が意図的なものかどうかはわかりませんが、注意が必要です。
昨日VS2013をインストールしましたが、最新のビルド(アップデート5)を使用しましたが、説明した動作を引き起こすバグがまだ残っています。
バグを回避するために、最初にdatagridviewがGUIで編集可能に設定されていることを確認してください。これには特に、コントロールの右上にあるフォームデザイナーの小さな矢印が含まれます。矢印のドロップダウンには「編集を有効にする」オプションがあり、有効になっていることを確認してください。ここで、フォームデザイナで、いくつかの主要な方法(列の追加や削除など)で列を編集します。これで、プログラムを実行すると、GUI編集が機能していることがわかります。
このバグを再現するには、フォームデザイナ内で、datagridviewコントロールの右上にある小さな矢印を使用して「編集を有効にする」をfalseに設定します。次に、列に大きな変更を加えます(列の追加や削除など)。プログラムをコンパイルして実行します。次に、小さな矢印に戻り、[編集を有効にする]チェックボックスを再度有効にします。プログラムを再度実行します。この時点でバグが明らかになり、VSで別の方法で構成した場合でも、datagridviewがGUIで編集できないことがわかります。
これは、「DataGridViewは一部の値(文字列)の変更を制限しますが、他の値(ブール)の変更は制限しません」という点に反する単なる拡張コメント(したがってwiki)です。どちらも編集可能ではありません。それを作成し、List<T>
両方を編集可能にします...:
using System;
using System.Collections.ObjectModel;
using System.Windows.Forms;
class Test
{
public string Foo { get; set; }
public bool Bar { get; set; }
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
var data = new ReadOnlyCollection<Test>(
new[] {
new Test {Foo="abc", Bar=true},
new Test {Foo="def", Bar=false},
new Test {Foo="ghi", Bar=true},
new Test {Foo="jkl", Bar=false},
});
Application.Run(
new Form {
Text = "ReadOnlyCollection test",
Controls = {
new DataGridView {
Dock = DockStyle.Fill,
DataSource = data,
ReadOnly = false
}
}
});
}
}
DataGridViewにどのようにバインドしていますか?1つは、データベースからクエリされたデータソースとしてLinqリストを使用していて、完全なオブジェクトがない場合、select関数で "with new"を指定しない限り、プロパティは読み取り専用です。あなたの投稿には多くの情報がありません。これがお役に立てば幸いです。
グローバルに定義されたコレクションにグリッドをバインドした場合は、バインドするスポット(関数)にコレクションのローカルクローンコピーを作成し、グリッドを新しいコレクションにバインドしてみてください。それは私のために働いた。
何もうまくいきませんでした。バインディングは使用しませんでした。すべてを読み取り専用ではなく、編集モードを(すべての値を試しました)に設定しました。セルは常に読み取り専用でした。
私がそれを機能させる方法は、イベントハンドラーでセルをReadOnly=falseに設定することでした。
private void gridViewSettings_CellClick(object sender,dataGridViewCellEventArgs e)
{
gridViewSettings.CurrentCell = gridViewSettings.Rows[e.RowIndex].Cells[e.ColumnIndex];
gridViewSettings.CurrentCell.ReadOnly = false;
gridViewSettings.BeginEdit(true);
}
このハンドラーの最後で、セルは編集モード(クリックしたセル)になっています。GUIで変更を行い、残り(存在する場合)はCellEndEditイベントハンドラーで処理されます。このハンドラーは、マウスがセルから出たとき、またはEnterキーを押したときに呼び出されます。
この時点で、新しい値がCurrentCell.Valueに保存されます。
String newValue = (String)gridViewSettings.CurrentCell.Value;
タスクをdatagridview
実行して[列の編集]をクリックし、[読み取り専用プロパティ]列をFalseに設定します