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

DataGridのセルの編集可/不可について。

分類:[.NET]

いつもお世話になっています。

早速質問させていただきます。

DataGrid上の任意のセルでダブルクリックされたら、
そのセルのみ編集可能状態にしたいのですが、
(その他のセルは編集不可)
なかなかうまく行きません。。

ダブルクリックのイベントを受け取るところまでは出来たのですが・・・

どなたかご存知の方がいらっしゃいましたら、
教えて下さい。
よろしくお願します。
■No1410に返信(SHさんの記事)
> DataGrid上の任意のセルでダブルクリックされたら、
> そのセルのみ編集可能状態にしたいのですが、
> (その他のセルは編集不可)
> なかなかうまく行きません。。

いろいろな方法が考えられると思いますが、その内の一つだと思ってください。(もっといい方法があるかもしれません。)
ここでは、セルのTextBoxオブジェクトのEnterとDoubleClickイベントでReadOnlyを変更しています。
意味がさっぱり分からないということであれば、次のURLを参考にしてください。

・.NET Tips - DataGridで選択されたセル内の選択された文字列を取得する
http://dobon.net/vb/dotnet/datagrid/selectedstringincell.html

private void Form1_Load(object sender, System.EventArgs e)
{
//DataGrid1にはテーブルスタイル"DataTable1"が設定されているものとする

//テーブルスタイルの取得
DataGridTableStyle ts;
ts = DataGrid1.TableStyles["DataTable1"];

//DataGridTextBoxColumnの取得
DataGridTextBoxColumn cs =
(DataGridTextBoxColumn) ts.GridColumnStyles[0];

//TextBoxの取得
TextBox tb = cs.TextBox;
tb.DoubleClick += new EventHandler(tb_DoubleClick);
tb.Enter += new EventHandler(tb_Enter);
}

private void tb_DoubleClick(object sender, EventArgs e)
{
((TextBox) sender).ReadOnly = false;
}

private void tb_Enter(object sender, EventArgs e)
{
((TextBox) sender).ReadOnly = true;
}
管理人様

お返事ありがとうございます。
返信いただいた内容を参考にしてみたのですが、
ダブルクリックのイベント時の動作がうまくいきません。。

返信内容の、
((TextBox) sender).ReadOnly = false;

はVB.NETではどのようにすればよいのでしょうか?
ちなみに、以下のようにコーディングしています。

Public Sub SetDataGrid()

  ' "DataTable" の作成
Me.DataGrid1.DataSource = CreateTable()
ts = New DataGridTableStyle()
ts.MappingName = "DataTable"
    
     ' Columnの追加
cs = New DataGridTextBoxColumn()
Dim tb As TextBox = cs.TextBox
cs.MappingName = "Column1"
cs.HeaderText = "Column1"
cs.Width = 150
cs.Alignment = HorizontalAlignment.Right
cs.ReadOnly = True

ts.GridColumnStyles.Add(cs)

     ' イベントハンドラ
AddHandler tb.DoubleClick, New EventHandler(AddressOf DataGridCell_DoubleClick)

Me.DataGrid1.TableStyles.Add(ts)

End Sub

Private Sub DataGridCell_DoubleClick(ByVal sender As System.Object, ByVal e As System.EventArgs)

    'ダブルクリック時の動作

End Sub


何度も申し訳ありません。
宜しくお願します。
■No1418に返信(SHさんの記事)

#VB.NETであれば、その旨をあらかじめ明記してください。(わざわざそのための欄を作ったのに...。)

> 返信内容の、
> ((TextBox) sender).ReadOnly = false;
>
> はVB.NETではどのようにすればよいのでしょうか?

CType(sender, TextBox).ReadOnly = False

となります。

C#からVB.NETへのコード変換は次のページが役に立ちます。

・C# to VB.NET Translator
http://authors.aspalliance.com/aldotnet/examples/translate.aspx

このツールで前に私が書いたコードを変換されると、次のようになります。

Private Sub Form1_Load(sender As Object, e As System.EventArgs)
'DataGrid1にはテーブルスタイル"DataTable1"が設定されているものとする
'テーブルスタイルの取得
Dim ts As DataGridTableStyle
ts = DataGrid1.TableStyles("DataTable1")

'DataGridTextBoxColumnの取得
Dim cs As DataGridTextBoxColumn = CType(ts.GridColumnStyles(0), DataGridTextBoxColumn)

'TextBoxの取得
Dim tb As TextBox = cs.TextBox
AddHandler tb.DoubleClick, AddressOf tb_DoubleClick
AddHandler tb.Enter, AddressOf tb_Enter
End Sub 'Form1_Load


Private Sub tb_DoubleClick(sender As Object, e As EventArgs)
CType(sender, TextBox).ReadOnly = False
End Sub 'tb_DoubleClick


Private Sub tb_Enter(sender As Object, e As EventArgs)
CType(sender, TextBox).ReadOnly = True
End Sub 'tb_Enter
管理人様

お返事ありがとうございます。

> #VB.NETであれば、その旨をあらかじめ明記してください。(わざわざそのための欄を作ったのに...。)

申し訳ありませんでした・・以後気をつけます。

教えてもらったやり方でうまく行きました!
とても助かりました!
ありがとうございます。
解決済み!

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