c#datagridviewチェックボックスマトリックス

私はdatagridviewのチェックボックスマトリックスを特別な方法で動作させるようにしています。 必須要件はあります。

  1. datagridview行のチェックボックスは1つだけ選択できます。
  2. 1行につき1つのチェックボックスをオンにする必要があります。

プログラムは起動時にファイルを読み込み、5列のうち3列がチェックボックス列である行を作成しています。行ごとに1つのチェックボックスしか選択できず、チェックボックスを完全に選択解除できないようにして、行の何も選択されないようにします。

現在、行ごとに1つのチェックボックスだけが選択されていることを確認するために、このコードを使用しています。

    private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {               
           for (int i = 0; i <= 2; i++)
           {
           dataGridView1.Rows[e.RowIndex].Cells[i].Value = false;
           }
    }

それにもかかわらず、2行目から2行目には何も選択されていません。チェックボックスをオフにしないで他のボックスを連続してチェックする機能を残すにはどうすればよいですか。

enter image description here

0
私は何かが足りないかもしれません。しかし、私はあなたがあなたがしていることのために間違ったコントロールを使っているかもしれないと感じます。チェックボックスは、オプションが「はい」または「いいえ」であることを示すために使用されます。単一の選択肢を示すために「複数の」チェックボックスを使用することは可能です。ただし、1つのコンボボックスの方が管理が簡単で、IMHOのほうがユーザーフレンドリーです。私は DataGridViewComboBoxColumn がより簡単なアプローチかもしれないと思います。コンボボックスを使用すると、1つの項目だけが選択されていることを検証する手間が省けます。ちょっとした考え。
追加された 著者 JohnG,
私は何かが足りないかもしれません。しかし、私はあなたがあなたがしていることのために間違ったコントロールを使っているかもしれないと感じます。チェックボックスは、オプションが「はい」または「いいえ」であることを示すために使用されます。単一の選択肢を示すために「複数の」チェックボックスを使用することは可能です。ただし、1つのコンボボックスの方が管理が簡単で、IMHOのほうがユーザーフレンドリーです。私は DataGridViewComboBoxColumn がより簡単なアプローチかもしれないと思います。コンボボックスを使用すると、1つの項目だけが選択されていることを検証する手間が省けます。ちょっとした考え。
追加された 著者 JohnG,

4 答え

何が欲しいのかよくわかりませんが、試してみてください。

private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
    if (dataGridView1.Rows[e.RowIndex].Cells[e.CellIndex].Value == false)
    {
        for (int i = 0; i <= 2; i++)
        {
            if (i != e.cellIndex)
                dataGridView1.Rows[e.RowIndex].Cells[i].Value = false;
        }
    }
}
0
追加された
このコードは残念ながら動作しませんが、そのようなアプローチについては考えていませんでした。私はあなたの考えに従うようにします。ありがとう。
追加された 著者 J.Pruchnik,

何が欲しいのかよくわかりませんが、試してみてください。

private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
    if (dataGridView1.Rows[e.RowIndex].Cells[e.CellIndex].Value == false)
    {
        for (int i = 0; i <= 2; i++)
        {
            if (i != e.cellIndex)
                dataGridView1.Rows[e.RowIndex].Cells[i].Value = false;
        }
    }
}
0
追加された
このコードは残念ながら動作しませんが、そのようなアプローチについては考えていませんでした。私はあなたの考えに従うようにします。ありがとう。
追加された 著者 J.Pruchnik,

DataGridViewプロパティ "EditMode"のみを使用したコードでは、問題は実際には発生しませんでした。デフォルトの "EditOnKeystrokeOrF2"から "EditProgramically"に変更すると、すべてが意図したとおりに機能します。

    private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {

            //on click reset whole row
            for (int i = 0; i <= 2; i++)
            {
            dataGridView1.Rows[e.RowIndex].Cells[i].Value = false;
            }

          //at the end make only last clicked cell "true"
            dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = true;

              //check if no atempt to uncheck checked cell
                 if (Convert.ToBoolean(dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value) == true)
                 {
                    dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = true;
                 }


    }
0
追加された

DataGridViewプロパティ "EditMode"のみを使用したコードでは、問題は実際には発生しませんでした。デフォルトの "EditOnKeystrokeOrF2"から "EditProgramically"に変更すると、すべてが意図したとおりに機能します。

    private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {

            //on click reset whole row
            for (int i = 0; i <= 2; i++)
            {
            dataGridView1.Rows[e.RowIndex].Cells[i].Value = false;
            }

          //at the end make only last clicked cell "true"
            dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = true;

              //check if no atempt to uncheck checked cell
                 if (Convert.ToBoolean(dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value) == true)
                 {
                    dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = true;
                 }


    }
0
追加された