DOBON.NET DOBON.NETプログラミング掲示板過去ログ

データグリッドでのセル単位の制御[入力制限]について

環境/言語:[VisualBasic.NET 2003]
分類:[.NET]

OS:Windows 2000
環境:VisualBasic.NET 2003

こんにちは。
データグリッドに表示させた項目の入力制限を試しています。

例えば、1行目、1カラム目のセルは入力可能だが、
    2行目、1カラム目のセルは入力不可。

と云う制御を実現したいと思っています。
カラム毎のリードオンリー化による制御が近いのかと試行錯誤を行っているのと併せて
現在、以下の方法や頁を試していますが実現には至っておりません。。

@セル単位のリードオンリー制約が出来るか?
 ⇒カラム全体への制御は可能でした。
Aセル単位の非活性化(Enabled?)が出来ないか?
 ⇒現在まで実現出来ない状態
Bhttp://dobon.net/vb/dotnet/datagrid/drawimage.htmlの頁を参考に
 セル単位のロック(入力出来ない状態)を試行錯誤中。

何か良いヒントでもあればお知恵を御貸し下さい。
こんにちわ。

DataGridのセルに(見えない)テキストボックスを貼り付ける
方法はどうでしょうか?

そのテキストボックスのクリックイベントで位置をひろい、
入力しても良いせるなら、テキストボックスを表示するようなやりかたです。

デフォルトはEnable = Falseにしておけば、
見た目は希望の動作ができるような気がするのですが・・・

もしくは、全部入力可能な状態にしておいて、
編集が終わった状態(カレントセルの移動?)で、
入力可のせるなら編集を反映させるようなやり方でしょうか。

入力不可にしたいセルの内容を編集できるのは気持ち悪いかもしれませんね。
発送を変えて…

フォームの情報表示部にデータグリッドを使わず、リストボックスを利用して
一行単位に入力出来る項目(活性化?)、入力出来ない項目(非活性化)のオブジェクトを羅列する方法を試していますが、現在のところ実現は難しそうです。
ご指南ありがとうございます。

テキスト入力の場合は見た目を微妙に誤魔化す事で「入力不可ですよー、入力しても無視だれますよー」と理由がつけられるのですが、
チェックボックス等の場合はチェック自体を不可とさせようかと思考中です。
いっその事、処理に関わらなければチェックを無視と云うのも思案しましたが、あまりに乱暴なので・・・。
イメージを実現させるのに力が足りないのがもどかしいです。
こんにちわ。
DataGridでセル単位の入力制御は、結構難しいものがあります。
以前同様のことをやろうとしたのですが、
結局違う方法にしました。

そのときは、ListViewコントロールで一覧を表示し、
ListViewコントロール上では入力不可にして、
画面のほかの部分に入力欄を用意しておき、
行を選択されたら入力欄に値を表示して編集させる方法にしました。

画面の構成がわかりませんので、この方法は無理なのかも知れませんが、
ListViewコントロールで一覧を表示する方法もあります。ということで・・・
> データグリッドに表示させた項目の入力制限を試しています。
>
> 例えば、1行目、1カラム目のセルは入力可能だが、
>     2行目、1カラム目のセルは入力不可。
>
> と云う制御を実現したいと思っています。
> カラム毎のリードオンリー化による制御が近いのかと試行錯誤を行っているのと併せて
> 現在、以下の方法や頁を試していますが実現には至っておりません。。
>
> @セル単位のリードオンリー制約が出来るか?
>  ⇒カラム全体への制御は可能でした。
> Aセル単位の非活性化(Enabled?)が出来ないか?
>  ⇒現在まで実現出来ない状態
> Bhttp://dobon.net/vb/dotnet/datagrid/drawimage.htmlの頁を参考に
>  セル単位のロック(入力出来ない状態)を試行錯誤中。

http://dobon.net/vb/dotnet/datagrid/drawimage.html
よりも

・DOBON.NET .NET Tips - DataGridでComboBoxを使う
http://dobon.net/vb/dotnet/datagrid/datagridcombobox.html

のほうが参考になるのではないでしょうか。これを参考に、DataGridComboBoxColumnクラスのEditメソッドをオーバーライドして、TextBoxのReadOnlyやEnabledを変更してみてはいかがでしょうか。

サンプルをのせておきます。ここでは、5で割り切れる行はReadOnlyをTrue、3で割り切れる行はEnabledをFalseにしています(意味は無いです)。(DataGridTextBoxColumnのReadOnlyは無視しています。)

Public Class DataGridTextBoxColumnEx
Inherits DataGridTextBoxColumn
Protected Overloads Overrides Sub Edit( _
ByVal source As System.Windows.Forms.CurrencyManager, _
ByVal rowNum As Integer, _
ByVal bounds As System.Drawing.Rectangle, _
ByVal [readOnly] As Boolean, _
ByVal instantText As String, _
ByVal cellIsVisible As Boolean)

'基本クラスのEditを呼び出す
MyBase.Edit(source, rowNum, bounds, [readOnly], _
instantText, cellIsVisible)

If rowNum Mod 5 = 0 Then
Me.TextBox.ReadOnly = True
Me.TextBox.Enabled = True
ElseIf rowNum Mod 3 = 0 Then
Me.TextBox.ReadOnly = False
Me.TextBox.Enabled = False
Else
Me.TextBox.ReadOnly = False
Me.TextBox.Enabled = True
End If
End Sub
End Class
皆様のご指南ありがとうございます。

私も発想を色々変えてデータグリッドと紐付けているデータレコードに隠しステータス(この項目はデータグリッド上、非表示)を載せ、
実際に入力させる項目と親子関係にさせ、親(データグリッド上、非表示)の切替により連動した子(データグリッド上、表示)を非活性化できないかと思って試し中です。
フォームに単純にチェックボックスを貼り付けて親子関係が解るようなインデントデザインを行いますと、自動的に連動してくれます。
…がコード展開しても特に参考になるような箇所は見つかりません。

-以下、画面イメージ-

□チェック1(親:初期活性化、チェック無し)
 ■チェック1−1(子:初期は非活性化)
 ■チェック1−2(子:初期は非活性化)

□チェック2(親:初期活性化、チェック無し)
 ■チェック2−1(子:初期は非活性化)
 ■チェック2−2(子:初期は非活性化)


↓チェック1にチェックをつけると…


□チェック1(親:活性化、チェック有り)
 □チェック1−1(子:活性化)
 □チェック1−2(子:活性化)

□チェック2(親:活性化、チェック無し)
 ■チェック2−1(子:非活性化)
 ■チェック2−2(子:非活性化)

となります。
これをデータグリッドに応用出来ないかと思っています。
色々試しまして良い例が出来上がりましたら随時、フィードバックしていきます。

DOBON.NET | プログラミング道 | プログラミング掲示板