6

全体の文脈を説明することなく、私の問題は基本的にこれです:

EntityFrameworkDbSetにバインドされているWindowsフォームにdatagridviewがありますdbSet<TEntity>.Local.ToBindingList()

datagridviewのReadOnlyプロパティを(デザインビューで)trueに設定し、コードに次のステートメントを含めると、次のようになります。

  myDataGridView.Rows[rowIndex].ReadOnly = false;

値を変更せずにステップスルーします!(いいえ、私のデータソースは読み取り専用ではありません。)

行のセルをループして、各セルのReadOnlyプロパティを個別に設定することも機能しません。

  foreach (DataGridViewCell cell in myDataGridView.Rows[rowIndex].Cells)
  {
      cell.ReadOnly = false;
  }

.ReadOnly-しかし、何らかの理由で設定できGets or sets a value indicating whether the user can edit the cells of the DataGridView control. ないように動作しています。

これが起こる理由はありますか?datagridviewのReadOnlyプロパティが特定の行/セルに加えられた変更を上書きする可能性があると思っていました(つまり、フォーム全体が読み取り専用かどうか)、これは誰かのために機能したようです...

私の最終目標を達成する方法は他にもありますが、これが私の状況の最も簡単な解決策であるため、このプロパティを変更できない理由を知りたいと思います。


編集:

私の質問を明確にしようと思います:

繰り返しになりますが、私の最終目標を達成する方法は他にもあることを認識していますが、この問題に対する回答を求めています。

原始的な例で申し訳ありませんが、問題を簡単に再現するには、WinFormアプリケーションを作成し、それにdatagridviewをスローして、このコードをプロジェクトに貼り付けます。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        dataGridView1.ReadOnly = true;
        string[] row1 = new string[] { "test", "test1" };
        string[] row2 = new string[] { "test2", "test3" };
        string[] row3 = new string[] { "test4", "test5" };
        dataGridView1.Columns.Add("1", "1");
        dataGridView1.Columns.Add("2", "2");
        dataGridView1.Rows.Add(row1);
        dataGridView1.Rows.Add(row2);
        dataGridView1.Rows.Add(row3);

        dataGridView1.Rows[1].ReadOnly = false;
    }
}

最後の行にブレークポイントを設定し、それをステップスルーすると、ReadOnlyプロパティが変更されないことがわかります。なぜ??

4

1 に答える 1

7

だから私は私の質問の解決策/回避策を見つけましたが、理由はまだわかりません...

明らかに、DataGridViewのReadOnlyプロパティを行ごとに変更する場合、メインのDataGridView.ReadOnlyプロパティを設定することはできません。これは、その後の変更を上書きするためです。

前の例を再利用するための回避策は、行をループして各ROWのReadOnlyプロパティを設定することです(datagridviewのReadOnlyプロパティを設定するのではなく)。次に、各行のReadOnlyプロパティを個別に変更できます。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        //dataGridView1.ReadOnly = true;
        string[] row1 = new string[] { "test", "test1" };
        string[] row2 = new string[] { "test2", "test3" };
        string[] row3 = new string[] { "test4", "test5" };
        dataGridView1.Columns.Add("1", "1");
        dataGridView1.Columns.Add("2", "2");
        dataGridView1.Rows.Add(row1);
        dataGridView1.Rows.Add(row2);
        dataGridView1.Rows.Add(row3);

        foreach (DataGridViewRow row in dataGridView1.Rows)
        {
            row.ReadOnly = true;
        }

        dataGridView1.Rows[1].ReadOnly = false;
    }
}

これは私にとってはうまく機能していますが、元の質問のコードが正しく機能しない理由についての洞察をいただければ幸いです。

于 2012-12-26T17:58:18.473 に答える