如何在gridview中创建类型密码列?

时间:2010-04-29 08:31:18

标签: c# winforms gridview passwords

我正在创建一个应用程序,用户在其中选择文件并提供打开该文件的凭据。为此,我在gridview中创建了三列 用户在密码栏中输入密码 我想显示 * 代替字符,就像我们可以创建密码类型的文本框一样。
我在GridView_CellClick事件中尝试了此代码:

if (GridView.Columns[e.ColumnIndex].HeaderText == "Password")
{ 
   txtPassword[e.RowIndex] = new TextBox();
   txtPassword[e.RowIndex].Name = "txtPassword"+e.RowIndex;
   txtPassword[e.RowIndex].PasswordChar = '*';
   txtPassword[e.RowIndex].Visible = true;
   txtPassword[e.RowIndex].TextChanged += new      

   if (GridView.CurrentCell.Value == null)
      txtPassword[e.RowIndex].Text = "";
   else
      txtPassword[e.RowIndex].Text = GridView.CurrentCell.Value.ToString();

   txtPassword[e.RowIndex].Location = GridView.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex + 1, false).Location;

   txtPassword[e.RowIndex].Size = GridView.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex + 1, false).Size;

   txtPassword[e.RowIndex].Visible = true;
   txtPassword[e.RowIndex].Focus();
} 

但在上面的解决方案中会显示字符 我该如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

我认为应该可以处理EditingControlShowing事件并在处理程序中添加以下代码:

if(e.ColumnIndex == 2)
{
    TextBox tb = e.Control as TextBox;
    if (tb != null)
    {
        tb.PasswordChar = '*';
    }
}

CellFormatting事件处理程序代码:

if(e.ColumnIndex = 2)
{
    if(e.Value != null)
    {
        e.Value = New string("*", e.Value.ToString().Length);
    }
}

在这种情况下,e应该有一个ColumnIndex属性:)

答案 1 :(得分:0)

一种解决方案是创建自己的单元格类型并将该类型分配给密码列。例如,您只会向其添加标准TextBoxPassword,然后它可以按您的意愿工作。

MSDN上有更详细的描述,可以找到源代码。

你只需要创建你的CellTemplate

答案 2 :(得分:0)

您可以创建自定义单元格和列,并使用带有密码掩码的文本框作为编辑控件。

为了在离开编辑模式时返回清除文本,您可以将实际密码值存储在单元格的单独属性中,并且在GetFormattedValue事件中(我相信)您可以返回完全由“ *“掩盖常规显示的字符。

Protected Overrides Function GetFormattedValue(ByVal value As Object, ByVal rowIndex As Integer, ByRef cellStyle As System.Windows.Forms.DataGridViewCellStyle, ByVal valueTypeConverter As System.ComponentModel.TypeConverter, ByVal formattedValueTypeConverter As System.ComponentModel.TypeConverter, ByVal context As System.Windows.Forms.DataGridViewDataErrorContexts) As Object
        Dim strVal As String

        strVal = New String(CChar("*"), value.ToString.Length)

        Return MyBase.GetFormattedValue(strVal, rowIndex, cellStyle, valueTypeConverter, formattedValueTypeConverter, context)

    End Function
    Public Overrides Sub InitializeEditingControl(ByVal rowIndex As Integer, _
    ByVal initialFormattedValue As Object, ByVal dataGridViewCellStyle As DataGridViewCellStyle)

        MyBase.InitializeEditingControl(rowIndex, initialFormattedValue, _
                                        dataGridViewCellStyle)

        Dim ctl As PasswordTextBoxEditingControl = _
            CType(DataGridView.EditingControl, PasswordTextBoxEditingControl)

        If IsDBNull(Me.Value) Then
            ctl.Text = ""


        Else
            ctl.Text = CType(Me.Value, String)
            ctl.PasswordChar = "*"
            ctl.Mask = "*"
        End If

    End Sub

有关您要执行的操作的详细信息,请访问: http://www.vbforums.com/showthread.php?t=554744