2016-12-14 3 views
1

Имея некоторые проблемы с некоторыми из моего кода, которые привели меня к кирпичной стене. Даже после нескольких часов поиска я не могу заставить его работать. Я совершенно новичок в C#, поэтому любой совет вообще, даже если он указывает мне в правильном направлении, будет очень благодарен!Проблемы с функцией изменения пароля

Что странно в том, что он правильно перемещается по набору данных, однако, когда он находит правильный row.ItemArray [0] .Equals (changeUserName), он не продолжает код и вместо этого пропускает его до «Change failed», ошибка, даже не покажет сообщение!

В основном то, что я пытаюсь сделать это:

Существует таблица с 3 столбцами. Имя пользователя Пароль и адрес электронной почты. Колонка паролей содержит хешированные пароли.

У меня есть форма с 4 этикетками и 4 текстовых полей:

  1. Имя пользователя - changeusername TextBox
  2. Текущий пароль - currentpassword Textbox
  3. Новый пароль - Новый_пароль Текстовое поле
  4. Подтвердите новый пароль - confirmnewpassword Текстовое поле

Пользователь заполняет эти формы, а затем обращается к Change Pas sword Button, которая запускает нижеследующую функцию:

(Эта функция должна проверять значение текстового поля имени пользователя (и текущего пароля, когда-то выполнявшегося через мою функцию HashPass), и сравнивать их со значениями в наборе данных. Если он находит соответствующие значения, он должен изменить значение пароля на новое значение пароля в текстовом поле newpassword. Однако это не делает, и я не могу понять, почему!)

Примечание: Некоторые из кода в // И искать соответствующие имена пользователей закомментированы, поскольку я просто пытался заставить его даже показать MessageBox, как только он находит соответствующее имя пользователя. Но это даже не сделало бы этого!

public void changePass(string changeusername, string old, string new1, string confirmnew) 
{ 
    string EncryptedPass = HashPass(new1); 

    //If there is no username 
    if (changeusername == null) 
    { 
     MessageBox.Show("Please Enter Username!"); 
     return; 
    } 

    //Confirm new pass must equal confirmnewpassword. 
    else if (new1 != confirmnew) 
    { 
     MessageBox.Show("New Passwords do not match"); 
    } 
    bool loop = false; 
    //loop database and update new password 
    foreach (DataRow row in <nameremoved>stockDataSet.login) 
    { 
     //And look for matching usernames 
     if (row.ItemArray[0].Equals(changeUserName)) 
     { 
      //row.ItemArray[1] = EncryptedPass; 
      MessageBox.Show("Change Success"); 
      loop = true; 
      return; 
     } 
    } 
    //Catch Error if Failure 

    if (loop == false) 
    { 
     MessageBox.Show("Change Failed"); 
    } 
} 
+2

Пропустили ли вы с помощью отладчика, какие значения (-ы) имеют значение 'row.ItemArray [0]'? – stuartd

+0

Если новые пароли не совпадают, вы показываете окно сообщения и продолжаете выполнение, поэтому даже если они не совпадают, это изменит пароль. Вы должны либо «возвращаться», либо переносить остальную часть кода в блок else. – eitamal

+0

yep !, массив элементов содержит имя пользователя, хешированный пароль и адрес электронной почты для каждой строки, в которой он проходит, что очень странно, я просто попробовал другое имя пользователя. Он обнаружил, что имя пользователя и дал мне сообщение с сообщением об изменении успеха. Однако он не изменил пароль, когда я прокомментировал строку row.itemarray [1] = EncryptedPass. Так что-то странное происходит Кроме того, Эйтамал, я этого не знал! Да, это было бы очень плохо. спасибо, что указали это! – Exxili

ответ

0

Вы не можете изменить один элемент внутри массива элементов с помощью индексатора.
Это происходит потому, что, когда вы пытаетесь получить доступ к свойству ItemArray, копия исходного массива создается и возвращается в ваш код.
И вы меняете предметы в этой копии, а не на оригинальную.

Вам нужно получить массив элемент возвращается, изменить его и назначить его к свойству ItemArray

foreach (DataRow row in <nameremoved>stockDataSet.login) 
{ 
    //And look for matching usernames 
    if (row.ItemArray[0].Equals(changeUserName)) 
    { 
     object[] returnedArray = row.ItemArray; 
     returnedArray[1] = EncryptedPass; 
     row.ItemArray = returnedArray; 
     MessageBox.Show("Change Success"); 
     loop = true; 
     return; 
    } 
} 

Вы можете проверить это поведение, глядя на Reference Source of ItemArray

Однако, я не могу понять почему вы хотите использовать свойство ItemArray в этом контексте.Вы можете просто обратитесь к строке/колонке, используя стандартный синтаксис или лучше использовать Выбрать метод на DataTable, чтобы найти ваш ряд

DataRow[] found = login.Select($"userName = '{changeUserName}'"); 
if(found != null && found.Length > 0) 
{ 
    found[0]["Password"] = EncryptedPass; 
} 

Здесь я предполагаю, что ваш первый столбец с именем имя_пользователя и вы второй столбец с именем Пароль (изменить их в соответствии с вашими именами)

+0

его код не входит в блок, который обновляет строку :). @Exxili, вы должны использовать переменную 'changeUserName' (это в правильном случае?). И, в связи с этим, решение, более простой код было бы просто для того, чтобы избежать ItemArray и использовать 'if (row [0] .Equals (changeUserName) {row [1] = new1;}' – Nino

+0

Эй, Стив. Это очень помогло мне .! и вы тоже Nino, из-за неправильного случая каких-то значений он не смог ввести этот блок. – Exxili

+0

Nino, Могу ли я затем изменить {row [1] = Hashpass (new1);}? сравнить два хэша, а не текстовый пароль? – Exxili

Смежные вопросы