C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: datagridviewのCellDoubleClick


(過去ログ 139 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■81848 / inTopicNo.1)  datagridviewのCellDoubleClick
  
□投稿者/ くま坊 (1回)-(2016/11/17(Thu) 14:36:43)

分類:[VB.NET/VB2005 以降] 

2016/11/18(Fri) 09:01:48 編集(投稿者)

OS:windows7
環境:visual studio 2015 (VB.NET)

datagridviewでTEST1列のセルをダブルクリックするとダブルクリックしたセルに"●"が書き込まれる。
それ以外のTEST1列のセルは""が入るようにしています。
1000行を超えると動作が重すぎて、困っています。
どのような方法なら軽くできるかご教授お願いします。

よろしくお願いします。

以下がソースになります。

   Private Sub DataGridView1_CellDoubleClick(sender As Object, e As DataGridViewCellEventArgs)                                     Handles DataGridView1.CellDoubleClick

     For iLoop As Integer = 0 To DataGridView1.RowCount - 1
        If iLoop = e.RowIndex Then 'クリック行の場合
         'クリック行で "●"
            If DataGridView1.Rows(iLoop).Cells("TEST1").Value.ToString = "●" Then
               DataGridView1.Rows(iLoop).Cells("TEST1").Value = ""
            Else
               DataGridView1.Rows(iLoop).Cells("TEST1").Value = "●"
            End If
         Else 'クリック行以外は空白
            DataGridView1.Rows(iLoop).Cells("TEST1").Value = ""
         End If
      Next
   End Sub


引用返信 編集キー/
■81851 / inTopicNo.2)  Re[1]: datagridviewのCellDoubleClick
□投稿者/ 魔界の仮面弁士 (956回)-(2016/11/17(Thu) 15:52:46)
No81848 (くま坊 さん) に返信
> ダブルクリックしたセルに"●"が書き込まれる。
> それ以外のTEST1列のセルは""が入るようにしています。

ダブルクリックする場所は、TEST1 列以外の場所でも良く、
行のどこかをダブルクリックしたときに
その行の TEST1 セルを、上記のようにしたいということですね。


> If DataGridView1.Rows(iLoop).Cells("TEST1").Value.ToString = "●" Then
>  DataGridView1.Rows(iLoop).Cells("").Value = ""

この部分、
 .Cells("TEST1").Value = ""
ではなく、
 .Cells("").Value = ""
なのは、意図的なものでしょうか。


> 1000行を超えると動作が重すぎて、困っています。

DataGridView を使う場合は、基本的に「データバインド」を使いましょう。


Public Class Form1
  Private WithEvents dataGridView1 As DataGridView
  Private tbl As DataTable

  Private Sub DataGridView1_CellDoubleClick(sender As Object, e As DataGridViewCellEventArgs) Handles dataGridView1.CellDoubleClick
    Dim dgv = DirectCast(sender, DataGridView)
    If e.RowIndex < 0 Then
      Return '列ヘッダーの行が操作された場合は何もしない
    End If

    '現在行の TEST1 の内容を取得
    Dim value As String = CStr(dgv("TEST1", e.RowIndex).Value)

    '既存の TEST1 を全クリア
    For Each row As DataRow In tbl.Rows
      row("TEST1") = ""
    Next

    '現在行の編集開始
    dgv.BeginEdit(False)
    If value = "●" Then
      '既に●が付いていたら、他の列をクリア
      dgv("TEST2", e.RowIndex).Value = ""
    Else
      'まだ●が付いてい無い場合は、●をセット
      dgv("TEST1", e.RowIndex).Value = "●"
    End If
    dgv.EndEdit()
  End Sub

  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    tbl = New DataTable()
    tbl.Columns.Add("Number", GetType(Integer)).ReadOnly = True
    tbl.Columns.Add("TEST1", GetType(String))
    tbl.Columns.Add("TEST2", GetType(String))
    For r = 1 To 2000
      tbl.Rows.Add(r, "", "")
    Next
    tbl.AcceptChanges()

    dataGridView1 = New DataGridView()
    dataGridView1.Dock = DockStyle.Fill
    dataGridView1.EditMode = DataGridViewEditMode.EditOnKeystrokeOrF2
    dataGridView1.SelectionMode = DataGridViewSelectionMode.CellSelect
    dataGridView1.AllowUserToAddRows = False
    dataGridView1.AllowUserToDeleteRows = False
    Controls.Add(dataGridView1)

    dataGridView1.DataSource = tbl
  End Sub
End Class
引用返信 編集キー/
■81863 / inTopicNo.3)  Re[2]: datagridviewのCellDoubleClick
□投稿者/ くま坊 (2回)-(2016/11/18(Fri) 09:01:10)
No81851 (魔界の仮面弁士 さん) に返信

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

> この部分、
>  .Cells("TEST1").Value = ""
> ではなく、
>  .Cells("").Value = ""
> なのは、意図的なものでしょうか。

誤字です。すみません。
.Cells("TEST1").Value = ""です。 ''記事修正します。

データバインドのこと全然考えてなかったです。
解決しましたありがとうございます。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -