8

ReadOnlyに設定されていないDataGridViewがあります。その列はいずれもReadOnlyに設定されておらず、バインドされているオブジェクトはReadOnlyに設定されていません。それでも、DataGridViewアイテムを編集できませんか?DataGridViewの.DataSourceプロパティはReadOnlyCollection<>に設定されていますが、UIからではなく、プログラムで要素を変更できます。どうしたの?

4

7 に答える 7

11

DataGridViewがReadOnlyCollectionにバインドされている場合、コレクション内の任意のアイテムをプログラムで編集できても、DataGridViewによって値の変更が制限されることがわかります。この動作が意図的なものかどうかはわかりませんが、注意が必要です。

于 2009-05-27T12:24:44.543 に答える
5

昨日VS2013をインストールしましたが、最新のビルド(アップデート5)を使用しましたが、説明した動作を引き起こすバグがまだ残っています。

バグを回避するために、最初にdatagridviewがGUIで編集可能に設定されていることを確認してください。これには特に、コントロールの右上にあるフォームデザイナーの小さな矢印が含まれます。矢印のドロップダウンには「編集を有効にする」オプションがあり、有効になっていることを確認してください。ここで、フォームデザイナで、いくつかの主要な方法(列の追加や削除など)で列を編集します。これで、プログラムを実行すると、GUI編集が機能していることがわかります。

このバグを再現するには、フォームデザイナ内で、datagridviewコントロールの右上にある小さな矢印を使用して「編集を有効にする」をfalseに設定します。次に、列に大きな変更を加えます(列の追加や削除など)。プログラムをコンパイルして実行します。次に、小さな矢印に戻り、[編集を有効にする]チェックボックスを再度有効にします。プログラムを再度実行します。この時点でバグが明らかになり、VSで別の方法で構成した場合でも、datagridviewがGUIで編集できないことがわかります。

于 2016-06-15T13:16:14.740 に答える
4

これは、「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
                    }
                }
            });
    }
}
于 2009-05-27T12:31:45.713 に答える
3

DataGridViewにどのようにバインドしていますか?1つは、データベースからクエリされたデータソースとしてLinqリストを使用していて、完全なオブジェクトがない場合、select関数で "with new"を指定しない限り、プロパティは読み取り専用です。あなたの投稿には多くの情報がありません。これがお役に立てば幸いです。

于 2009-05-27T12:52:33.970 に答える
1

グローバルに定義されたコレクションにグリッドをバインドした場合は、バインドするスポット(関数)にコレクションのローカルクローンコピーを作成し、グリッドを新しいコレクションにバインドしてみてください。それは私のために働いた。

于 2020-09-15T12:28:12.093 に答える
0

何もうまくいきませんでした。バインディングは使用しませんでした。すべてを読み取り専用ではなく、編集モードを(すべての値を試しました)に設定しました。セルは常に読み取り専用でした。

私がそれを機能させる方法は、イベントハンドラーでセルを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;
于 2021-06-06T08:38:08.350 に答える
-2

タスクをdatagridview実行して[列の編集]をクリックし、[読み取り専用プロパティ]列をFalseに設定します

于 2016-02-11T12:31:39.483 に答える