DataGridViewのセルに入力された文字をマスクしたい

タグの編集
投稿者   (社会人) 投稿日時 2009/1/2 01:45:36
こんにちは。
いつもお世話になっております。
VB2008を使用しています。

早速ですが、題名の通り
DataGridViewのセルに入力された文字を
マスクしたいと考えています。

Replaceメソッド等で表示されている文字を
"*"に置換して表示する方法を思いついたのですが、
編集する際などの処理が複雑になりそうなので
できれば置換したくありません。

何かいい方法があればご教授願いたいと思います。
よろしくお願いいたします。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2009/1/3 20:38:47
その「マスク」の目的にもよるかと思います。

マスク エディット コントロールを使いたい、という意図であれば、
http://dobon.net/vb/dotnet/datagridview/maskedtextboxcolumn.html
のようにすることができます。


パスワード入力を目的としているのであれば、こんな感じで如何でしょう。
(この場合、そもそも「***」なパスワードを画面に表示させておく必要があるのか微妙ですが…)

Imports System.Windows.Forms
Imports System.Drawing
Public Class Form1
    Private WithEvents dgv As New DataGridView()

    ''' <summary>パスワード表示するセル座標なら True を返す</summary> 
    Private Function IsPasswordCell(ByVal row As IntegerByVal column As IntegerAs Boolean
        'この部分は、実際の判定条件に応じて変更してください。 
        Return column = 1
    End Function
    ''' <summary>パスワード表示するセル座標なら True を返す</summary> 
    Private Function IsPasswordCell(ByVal address As Point) As Boolean
        Return IsPasswordCell(address.Y, address.X)
    End Function

    Private Sub Form1_Load() Handles Me.Load
        dgv.Dock = DockStyle.Fill
        Controls.Add(dgv)
        dgv.AllowUserToAddRows = False
        dgv.ColumnCount = 5
        dgv.RowCount = 20
        dgv.EditMode = DataGridViewEditMode.EditOnEnter
    End Sub

    Private Sub dgv_EditingControlShowing(ByVal sender As ObjectByVal e _
      As DataGridViewEditingControlShowingEventArgs) Handles dgv.EditingControlShowing
        Dim t As TextBox = TryCast(e.Control, TextBox)
        If t IsNot Nothing Then
            '入力時のパスワード隠し 
            t.UseSystemPasswordChar = IsPasswordCell(dgv.CurrentCellAddress)
        End If
    End Sub

    Private Sub dgv_CellFormatting(ByVal sender As ObjectByVal e As _
      DataGridViewCellFormattingEventArgs) Handles dgv.CellFormatting
        If IsPasswordCell(e.RowIndex, e.ColumnIndex) Then
            '表示時のパスワード隠し 
            e.Value = StrDup(Len(e.Value), "*"c)
        End If
    End Sub

    'Private Sub dgv_CellEnter(ByVal sender As DataGridView, ByVal e As DataGridViewCellEventArgs) Handles dgv.CellEnter 
    '    Text = CStr(sender(e.ColumnIndex, e.RowIndex).Value) 
    'End Sub 
End Class
投稿者   (社会人) 投稿日時 2009/1/4 01:48:38
魔界の仮面弁士さん、ありがとうございます。
説明不足ですみませんでした。

DataGridViewでいくつかのパスワードを並べて表示したかったのですが、
その際にそのまま表示する場合と、全て"*"で表示する場合を
切り替えたかったのですが、方法が分かりませんでした。

教えていただいたコードを参考に、解決することができました。
ありがとうございました。
投稿者 yyy  (社会人) 投稿日時 2013/12/26 16:06:35
タイトルに書いてあることと同じようなことがしたくて、ソースを参考にさせてもらいましたが、
手入力でマスクされている文字を1文字だけ削除して別のセルへ移動すると、
元々入力していた文字が*に変わってしまいます。。
スマートな回避方法はないものかと思い、投稿してみました。