web-dev-qa-db-ja.com

DataGridViewで選択する機能を無効にする方法

DataGridViewを使用して物事を表示したいだけで、ユーザーがDataGridViewから行、フィールド、または何かを選択できないようにします。

これどうやってするの?

53

私はこれで行きます:

private void myDataGridView_SelectionChanged(Object sender, EventArgs e)
{
    dgvSomeDataGridView.ClearSelection();  
}

私はDataGridViewを選択不可にするべきではないという広範な主張には同意しません。一部のUIはツールまたはタッチスクリーン用に構築されており、選択を許可すると、ユーザーは選択すると実際にどこかに移動すると考えるようになります。

コントロールでReadOnly = trueを設定しても、セルまたは行を選択できるかどうかには影響しません。また、Enabled = falseの設定には視覚的および機能的な欠点があります。

別のオプションは、選択されたコントロールの色を、選択されていない色とまったく同じに設定することですが、たまたまセルの背景色を操作している場合、このメソッドは厄介な結果をもたらします。

116
edhubbell

次のように、選択したセルに透明な背景色を設定できます。

DataGridView.RowsDefaultCellStyle.SelectionBackColor = System.Drawing.Color.Transparent;
16
user4101525

Enabledプロパティからfalse

または

this.dataGridView1.DefaultCellStyle.SelectionBackColor = this.dataGridView1.DefaultCellStyle.BackColor;
this.dataGridView1.DefaultCellStyle.SelectionForeColor = this.dataGridView1.DefaultCellStyle.ForeColor;
8
Ramgy Borja

Enabledプロパティをfalseに設定することでこれを修正しました。

2
Rick

すべてのAllowUser...プロパティをfalseに、ReadOnlytrueに、RowHeadersVisiblefalseに、ScollBarsNoneに設定してから、 選択の防止を偽装 が最適でした。 Enabledfalseに設定しない場合でも、ユーザーはグリッドからデータをコピーできます。

次のコードは、単純な表示グリッドが必要な場合に外観をクリーンアップします(行の高さが同じであると仮定します)。

int width = 0;
for (int i = 0; i < dataGridView1.Columns.Count; i++)
{
    width += dataGridView1.Columns[i].Width;
}

dataGridView1.Width = width;
dataGridView1.Height = dataGridView1.Rows[0].Height*(dataGridView1.Rows.Count+1);
1
SharpC

これは私にとって魅力的でした:

row.DataGridView.Enabled = false;

row.DefaultCellStyle.BackColor = Color.LightGray;

row.DefaultCellStyle.ForeColor = Color.DarkGray;

(ここで行= DataGridView.NewRow(適切なオーバーロード);)

1
Paddy

理論的にはuser4101525の答えが一番好きでしたが、実際にはうまくいきません。選択はオーバーレイではないため、制御下にあるものはすべて表示されます

Ramgy Borjaの答えは、デフォルトのスタイルが実際には色ではないという事実を扱っていないため、適用しても意味がありません。これはデフォルトのスタイルを処理し、独自の色を適用する場合に機能します(edhubbellが厄介な結果と呼ぶ場合があります)

dgv.RowsDefaultCellStyle.SelectionBackColor = dgv.RowsDefaultCellStyle.BackColor.IsEmpty ? System.Drawing.Color.White : dgv.RowsDefaultCellStyle.BackColor;
dgv.RowsDefaultCellStyle.SelectionForeColor = dgv.RowsDefaultCellStyle.ForeColor.IsEmpty ? System.Drawing.Color.Black : dgv.RowsDefaultCellStyle.ForeColor;
0
Bengineer

DataGridView.ReadOnlyプロパティ を使用します

MSDNの例 のコードは、主に表示用のDataGridViewコントロールでのこのプロパティの使用を示しています。この例では、コントロールの視覚的な外観はいくつかの方法でカスタマイズされており、コントロールは制限された対話性用に構成されています

サンプルコードで次の設定を確認します。

// Set property values appropriate for read-only
// display and limited interactivity
dataGridView1.AllowUserToAddRows = false;
dataGridView1.AllowUserToDeleteRows = false;
dataGridView1.AllowUserToOrderColumns = true;
dataGridView1.ReadOnly = true;
dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridView1.MultiSelect = false;
dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;
dataGridView1.AllowUserToResizeColumns = false;
dataGridView1.ColumnHeadersHeightSizeMode = 
DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
dataGridView1.AllowUserToResizeRows = false;
dataGridView1.RowHeadersWidthSizeMode = 
DataGridViewRowHeadersWidthSizeMode.DisableResizing;
0

カスタムDataGridViewを作成する必要があります

`

namespace System.Windows.Forms
{
    class MyDataGridView : DataGridView
    {
        public bool PreventUserClick = false;

        public MyDataGridView()
        {

        }
        protected override void OnMouseDown(MouseEventArgs e)
        {
            if (PreventUserClick) return;

            base.OnMouseDown(e);
        }
    }
}

`新しいコントロールを使用する前に、クラスを追加してプログラムを一度コンパイルする必要があることに注意してください。

次に.Designer.csに移動し、以前のコードを台無しにすることなく、古いDataGridViewを新しいものに変更します。

private System.Windows.Forms.DataGridView dgv; // found close to the bottom

private void InitializeComponent() {
    ...
    this.dgv = new System.Windows.Forms.DataGridView();
    ...
}

(それぞれ)

private System.Windows.Forms.MyDataGridView dgv;

this.dgv = new System.Windows.Forms.MyDataGridView();
0
Jannik Svensson