2009-06-03 30 views
10

大量のデータを含むバインドされたDataGridViewがあります。問題は、一部のセルがReadOnlyでなければならず、ユーザーがTABまたはENTERでセル間を移動するときにも、ReadOnlyセルをバイパスする必要があることです。読み込み後に特定のセルをReadOnlyで作成する最善の方法は何ですか?DataGridView読み取り専用セル

DataSourceを設定した後にセルをループすることは、グリッドに大量のデータがあることを考慮してはお勧めできません。また、TABキーでナビゲートすると、次のセルがReadOnlyであるかどうかを既に知っていなければならないため、CellEnterでセルReadOnlyを作成することはできません。

答えて

17

は読み取り専用データをバインドする前に、列ではなく、個々の細胞を作るために試してみてください。

this.dgrid.Columns["colName"].ReadOnly = true; 

あなたが列内の個々のセルのために行う必要がある場合は、あなたがループに持っていると、このようにそれらを設定します:

this.dgridvwMain.Rows[index].Cells["colName"].ReadOnly = true; 
+0

私は、カラム内の細胞の一部は、読み取り専用、他ではない可能性ができません。いくつかのフラグに依存します。 –

+0

個々の列について、それをループしてtrueに設定する必要があります。それは時間がかかりますが、他の選択肢はないと思います。 –

+2

.ReadOnly = true - yesですが、これはデータのバインドが完了した後に行う必要があります。例えば。 DataGridView.DataBindingCompleteイベントハンドラの – Boogier

0

列が(のRashmiの応答を参照)のみ読み込まれたら、あなたはこのイベントを処理することができます...

private void dataGridView1_KeyPress(object sender, KeyPressEventArgs e) 
{ 
    if (e.KeyChar == (char)Keys.Tab) 
    { 
     Boolean readOnly = (sender as DataGridView).SelectedCells[0].ReadOnly; 

     return; 
    } 

} 

次のセルの読み取り専用プロパティを取得します。

おかげ

+0

同じ列内のいくつかのセルがReadOnlyであり、他のセルがそうでない場合があるため、ReadOnlyに列を置くことはできません。いくつかのフラグに依存します。 –

+0

気温が100%でないのは、私が書いたコードにReadOnlyの影響を与えることさえあります。それは試してみる価値があるかもしれません... –

1

私はこれを試していません。

しかし、RowEnterイベントで、セルのreadonlyプロパティをtrueに設定することができます(Rashmiごとに)?

ある行から別の行に移動するとき(またはセルA1からB3に変更するとき)、RowEnterイベントが発生するはずです。

それはまったく役に立ちますか?

-2

非常に素晴らしいサンプルがここにあります:あなたはちょうどPaint()をオーバーライドする必要が
http://blogs.msdn.com/netcfteam/archive/2006/04/25/583542.aspx

、私は同じノートにセルの内容に応じて、背景色を変更するには、コンパクトなフレームワーク上でこれを使用してきたあなたは「shouldnそれらを読み取り専用に設定するのに問題がありません。

+2

-1問題を解決するために間違った方法。 – siride

+0

リンクのみの回答は投稿のガイドラインに反しています。完全な答えは、ユーザーが問題を解決するために別のページに移動する必要がないことです。 – orgtigger

-1

バインドされた列ではなくテンプレート列を使用して、フィールドの読み取り専用の条件を設定できませんか?

次に、読み取り専用のラベルと編集可能なテキストボックスを表示できます。ラベルはタブのインデックスに影響しません。

<asp:TemplateColumn> 
    <ItemTemplate> 
<% 
    if (<%# Eval("ReadOnlyFlag") %>) 
    { 
%> 
    <asp:Label Text="<%# Eval("BoundColumn") %>" /> 
<% 
    } 
    else 
    { 
%> 
    <asp:Textbox Text="<%# Eval("BoundColumn") %>" /> 
<% 
    } 
%> 
    </ItemTemplate> 
</asp:TemplateColumn> 
+2

ASP.NETは "DataGridView"を持っていません... OPはWinFormsの回答を求めています。 –

4

CellBeginEditイベントを使用し、セルを無効にする必要がある場合はe.Cancel = Trueに設定できます。

Private Sub DataGridView_CellBeginEdit(sender As System.Object, e As System.Windows.Forms.DataGridViewCellCancelEventArgs) Handles DataGridViewMsg.CellBeginEdit 
    If DataGridViewMsg.Rows(e.RowIndex).Cells("disable").Value = "Y" Then 
     e.Cancel = True 
    End If 
End Sub 
1
this.dataGridViewEmpList.EditMode = DataGridViewEditMode.EditProgrammatically; 
関連する問題