Как создать столбец типа пароля в gridview? - PullRequest
4 голосов
/ 29 апреля 2010

Я создаю приложение, в котором пользователь выбирает файлы и предоставляет учетные данные для открытия этого файла. Для этого я создал три столбца в виде сетки.
Пользователь вводит пароль в столбце пароля.
Я хочу отобразить * вместо символов, как мы можем создать текстовое поле типа пароля.
Я пытался этот код на 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 ]

1 голос
/ 29 апреля 2010

Я думаю, что это должно работать для обработки события 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:)

0 голосов
/ 19 мая 2010

Вы можете создать пользовательскую ячейку и столбец и использовать текстовое поле с маской пароля в качестве элемента управления для редактирования.

Чтобы обойти возвращение открытого текста, когда вы выходите из режима редактирования, вы можете сохранить действительное значение пароля в отдельном свойстве ячейки, а в событии 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

0 голосов
/ 29 апреля 2010

Одним из решений было бы создание собственного типа ячейки и присвоение этого типа вашему столбцу пароля.Например, вы добавите к нему только стандартный TextBoxPassword, и тогда он будет работать так, как вы хотите.

На MSDN имеется более подробное описание с исходным кодом.

Вам просто нужно создать выигранный вид CellTemplate .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...