0

私は DataGridView を持つフォームを持っています。特定の条件に基づいて、プログラムで単一の行の選択を解除します (に設定Selectedすることによりfalse)。しかし、それを行うと、別の行が現在選択されている場合、その行も選択解除されます。DataGridView を に設定しましたMultiSelect = false。ユーザーは単一の行のみを選択できる必要があります。

行のSelectedプロパティを設定すると、コントロールは行を選択していると認識し、以前に選択した行を選択解除するようです。Selectedプロパティをに設定しているという事実は、falseその動作を変更しません。MultiSelectこれは、が に設定されfalseSelectionModeが に設定されている場合にのみ発生 しFullRowSelectます。

現在の場合、プロパティを設定するだけで解決できますtrue

if (row.Selected) row.Selected = false;

しかし、なぜこれが起こるのか知りたいです。また、SelectionMode が FullRowSelect に設定されている場合のみ、なぜですか?

完全な例

次のサンプル コードには、完全な動作例が含まれています。コンストラクターは 3 つの行を追加します。ボタンをクリックすると、中央の行の選択が解除されます。ただし、ボタンをクリックする前にどの行が選択されていても、最終的には行が選択されていません。

using System;
using System.Windows.Forms;

class MainForm : Form
{
    static void Main() { Application.Run(new MainForm()); }

    private DataGridView _dataGridView;
    private Button _SelectButton;

    public MainForm()
    {
        _dataGridView = new DataGridView
        { ReadOnly = true, AllowUserToAddRows = false };
        _dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
        _dataGridView.Dock = DockStyle.Fill;
        _dataGridView.MultiSelect = false;
        _dataGridView.Columns.Add(new DataGridViewColumn
        { CellTemplate = new DataGridViewTextBoxCell() });
        _dataGridView.Rows.Add("1");
        _dataGridView.Rows.Add("2");
        _dataGridView.Rows.Add("3");
        Controls.Add(_dataGridView);
        _SelectButton = new Button { Text = "Deselect middle row" };
        _SelectButton.Click += _SelectButton_Click;
        _SelectButton.Dock = DockStyle.Bottom;
        Controls.Add(_SelectButton);
    }

    void _SelectButton_Click(object sender, EventArgs e)
    {
        _dataGridView.Rows[1].Selected = false;
    }
}
4

1 に答える 1

0

これは奇妙な動作であることに同意します。複数選択を許可している場合は期待どおりに動作しますが、複数選択を許可していない場合は、 を呼び出したかのように動作するようです_dataGridView.ClearSelection;。私が見ることができる唯一の解決策は、問題の行が選択解除される前に選択されているかどうかを単純にテストすることです。

void _SelectButton_Click(object sender, EventArgs e)
{
    if (_dataGridView.Rows[1].Selected)
    {
        _dataGridView.Rows[1].Selected = false;
    }            
}
于 2013-02-04T20:31:49.000 に答える