Как восстановить пароль из ячейки таблицы данных c # Winforms после маскировки при сохранении данных - PullRequest
0 голосов
/ 23 мая 2018

Я использовал приведенные ниже коды для маскировки своего пароля в datagridview, и я успешно это делаю.

private void gvInstanceDetails_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
    {
      if (e.ColumnIndex == 4)
      {
        if (e.Value != null)
        {
          gvInstanceDetails.Rows[e.RowIndex].Tag = e.Value;
          e.Value = new string('\u2022', e.Value.ToString().Length);
        }
      }
    }

    private void gvInstanceDetails_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
    {      
        TextBox t = e.Control as TextBox;
        if (t != null)
        {
          t.UseSystemPasswordChar = true;
        }      
    } 

После маскировки я не могу получить значение, которое вводится пользователем, в поле пароля, если пользователь не удаляет весь текст и повторно вводит пароль.

например: - если пароль похож на ***** и пользователь заменяет последние два символа и вводит 34, то при сохранении я получаю строку как *** 34.

Спасибо

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Быстрое исправление

EditingControl использует FormattedValue ячейки для редактирования.

В качестве быстрого исправления, в обработчике EditingControlShowing установите Value CurrentCell как Text из TextBox:

private void DataGridView1_EditingControlShowing(object sender,
    DataGridViewEditingControlShowingEventArgs e)
{
    if (dataGridView1.CurrentCell.ColumnIndex == 4)
    {
        var txt = (TextBox)e.Control;
        txt.Text = $"{dataGridView1.CurrentCell.Value}";
        txt.UseSystemPasswordChar = true;
    }
}

Лучший вариант - Создать DataGridViewPasswordColumn

В качестве лучшего варианта создайте DataGridViewPasswordColumn, который обрабатывает логику для вас:

public class DataGridViewPasswordColumn : DataGridViewTextBoxColumn
{
    public DataGridViewPasswordColumn()
    {
        this.CellTemplate = new DataGriViewPasswordCell();
    }
}
public class DataGriViewPasswordCell : DataGridViewTextBoxCell
{
    public override void InitializeEditingControl(int rowIndex, 
        object initialFormattedValue,
        DataGridViewCellStyle dataGridViewCellStyle)
    {
        base.InitializeEditingControl(rowIndex, 
            initialFormattedValue, dataGridViewCellStyle);
        ((TextBox)this.DataGridView.EditingControl).UseSystemPasswordChar = true;
    }
    protected override void Paint(Graphics graphics, 
        Rectangle clipBounds, Rectangle cellBounds,
        int rowIndex, DataGridViewElementStates cellState,
        object value, object formattedValue,
        string errorText, DataGridViewCellStyle cellStyle,
        DataGridViewAdvancedBorderStyle advancedBorderStyle, 
        DataGridViewPaintParts paintParts)
    {
        var i = $"{formattedValue}".Length;
        formattedValue = new string('●', i);
        base.Paint(graphics, clipBounds, cellBounds, rowIndex,
            cellState, value, formattedValue,
            errorText, cellStyle, advancedBorderStyle, paintParts);
    }
}
0 голосов
/ 23 мая 2018

Не то чтобы я использовал winforms DataGrids.Однако ...

Вы убиваете данные с помощью

e.Value = new string('\u2022', e.Value.ToString().Length);

Однако вы помещаете в тег

 gvInstanceDetails.Rows[e.RowIndex].Tag = e.Value;

Если вы знаете нужную строку, выпросто нужно позвонить

var myAwesomePassword = (string) gvInstanceDetails.Rows[someArbitaryRow].Tag
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...