我的一些代码遇到了一些问题,这些问题让我陷入困境。即使经过几个小时的搜索,我似乎无法让它发挥作用。我对c#很新,所以即使它指出了我正确的方向,任何建议都将非常感谢!
奇怪的是它正确地循环遍历数据集,但是当它找到正确的row.ItemArray [0] .Equals(changeUserName)时,它不会继续代码而是跳过它到& #34;改变失败"错误,甚至不会显示消息框!
基本上我想要完成的是:
有一个包含3列的表格。用户名密码和电子邮件。密码列包含哈希密码。
我有一个包含4个标签和4个文本字段的表单:
用户填写这些表格,然后点击更改密码按钮,这将启动以下功能:
(此函数应检查用户名文本框的值(当前密码一旦通过我的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");
}
}
答案 0 :(得分: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上的Select方法来查找行
DataRow[] found = login.Select($"userName = '{changeUserName}'");
if(found != null && found.Length > 0)
{
found[0]["Password"] = EncryptedPass;
}
这里我假设您的第一列名为 userName ,而您的第二列名为密码(更改它们以符合您的姓名)