0

На форме есть listbox, кнопка (при нажатие генерируются ключи RSA)
Задача такая, чтобы при генерации сохранялся приватный ключ, публичный ключ и имя файла оставались в свойствах класса (для дальнейшего обращения)
При выборе элемента имени файла ключа из listbox'a выводить данные выбранного ключа (от имени файла)
Класс RSAKeys

public class RSAKeys
{
        public string PublicKeyXML { get; set; }
        public string PrivateKeyXML { get; set; }
        public string FileName { get; set; }
    public RSAKeys(string parPublicXMLKey, string partPrivateXMLKey)
    {
        PrivateKeyXML = partPrivateXMLKey;
        PublicKeyXML = parPublicXMLKey;
    }

    public RSAKeys() { } // Добавил пустой конструктор, потому что без него просто ругается на добавление аргументов.

    public override string ToString() => FileName;

}

Кнопка генерации ключей RSA

private void GenNewKEYS_Click(object sender, EventArgs e) // Button
{
    using (RSA rsa = new RSACryptoServiceProvider(2048)) // Generate a new 2048 bit RSA key
    {
       string publicKeyXML = rsa.ToXmlString(true); // Открытый ключ RSA
       string PrivateKeyXML = rsa.ToXmlString(false); // Закрытый ключ RSA
       string fname = Path.GetFileName("PrivateKey_#1"); // Тут рандомно сохраняется путь до приватного ключа
   //RSAKeys key = new RSAKeys(); 
   RSAKeys key = new(publicKeyXml, fname);          
   rsaKeys.Add(key);
   File.WriteAllText(fname+".xl", PrivateKeyXML);
   listBox1.Items.Add(rsaKeys); // Добавляю в listBox отображение имени файла приватного ключа
}

}

Далее

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
     //RSAKeys key = new();
    // string curKey = listBox1.SelectedItem.ToString();
 RSAKeys curKey = (RSAKeys)listBox1.SelectedItem;
 // через curKey нужно сделать обращение с выбранным ключём чтобы он отображал все нужные данные.

}

Но получаю ошибки на null и

System.InvalidCastException: Не удалось привести тип объекта "System.String" к типу "RSAKeys".

  • SelectedValue – aepot Oct 29 '22 at 00:07
  • @aepot, System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта. - это в listBox1_SelectedIndexChanged – ZuPoo Switch Oct 29 '22 at 00:11
  • Понял, в чем дело. Научитесь использовать привязки, в листбоксе данные не удастся хранить полноценно. https://ru.stackoverflow.com/a/1199692/373567 тогда SelectedValue заработает. – aepot Oct 29 '22 at 00:13
  • @aepot, сложно как-то, а можно проще? – ZuPoo Switch Oct 29 '22 at 00:19
  • 1
    Что сложного, берете private readonly BindingList<RSAKeys> rsaKeys = new BindingList<RSAKeys>(); вместо того списка что у вас. Берете однократно при запуске приложения делаете listBox1.DataSource = rsaKeys;, строчку listBox1.Items.Add(rsaKeys); удаляете, и готово. – aepot Oct 29 '22 at 00:27
  • 1
    Ааааа, тю блин, не знал, спасибо! Буду пользоваться ) – ZuPoo Switch Oct 29 '22 at 00:30
  • У вас кстати в классе RSAKeys бардак, присваиваете в конструкторе одно, отображаете в ToString другое. – aepot Oct 29 '22 at 00:31
  • 1
    Вам вообще не нужен ToString, вместо этого задайте однократно listBox1.DisplayMember = "FileName";. Не ленитесь читать документацию, там много всего интересного https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.listbox – aepot Oct 29 '22 at 00:37
  • @aepot, спасибо большое! Всё получилось!! А подскажите, как мне можно при загрузке формы, загрузить данные из файлов в класс свойств RSAKeys и добавить имена ключей в listBox те, которые есть. Ключи хранятся в папке рядом с файлом – ZuPoo Switch Oct 30 '22 at 00:12
  • Слишком общий вопрос. Попробуйте сами, а если не получится, задайте отдельный вопрос. – aepot Oct 30 '22 at 00:31

0 Answers0