मैंने डेटाग्रिडव्यू में अपना पासवर्ड मास्क करने के लिए नीचे दिए गए कोड का उपयोग किया है और मैं इसे सफलतापूर्वक कर रहा हूं।

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 के रूप में स्ट्रिंग मिल रही है।

धन्यवाद

1
Sakti Behera 23 मई 2018, 08:54

2 जवाब

सबसे बढ़िया उत्तर

जल्दी ठीक

संपादन के लिए EditingControl सेल के FormattedValue का उपयोग करता है।

एक त्वरित समाधान के रूप में, EditingControlShowing हैंडलर में CurrentCell के Value को TextBox के Text के रूप में सेट करें:

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);
    }
}
3
Reza Aghaei 23 मई 2018, 09:34

ऐसा नहीं है कि मैं 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
0
TheGeneral 23 मई 2018, 09:03