2

I was wondering if somebody could point me in the right direction.My program has 1 dropdown list, 2 text boxes and 2 buttons.

namespace passwordReset
{
    public partial class Form1 : Form
    {
        //variables to mess with the password
        public string password1;
        public string password2;
        public string username;

         public Form1()

        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            SqlConnection connection = new SqlConnection(xxxxxxx);
            connection.Open();
            string query = "select Login, Password from Employees order by Login desc";
            SqlDataAdapter da = new SqlDataAdapter(query, connection);
            DataSet ds = new DataSet();
            da.Fill(ds, "Credentials");
            ddlLogin.DisplayMember = "Login";
            ddlLogin.ValueMember = "Password";
            ddlLogin.DataSource = ds.Tables["Credentials"];
            connection.Close();

        }

        private void ddlLogin_SelectedIndexChanged(object sender, EventArgs e)
        {


            if (ddlLogin.SelectedItem != null)
           {
               DataRowView drv = ddlLogin.SelectedItem as DataRowView;
               //MessageBox.Show("The username you selected is: " + drv.Row["Login"].ToString());
               //MessageBox.Show("The password you selected is: " + drv.Row["Password"].ToString());
               //MessageBox.Show("username selected is: " + ddlLogin.Text.ToString());
               //MessageBox.Show("password is: " + ddlLogin.SelectedValue.ToString()); 
           }

        }

        private void txtPassword1_TextChanged(object sender, EventArgs e)
        {
             password1 = txtPassword1.Text;

        }

        private void txtPassword2_TextChanged(object sender, EventArgs e)
        {
             password2 = txtPassword2.Text;
        }

        private void btnReset_Click(object sender, EventArgs e)
        {
            if (ddlLogin.Text == "rruales" || ddlLogin.Text == "xxxxx" || ddlLogin.Text == "xxxxxx")
            {
                MessageBox.Show("Cannot change this user's password");

            }
            if (password1 == password2 && ddlLogin.Text != "rruales" && ddlLogin.Text != "xxxxx" && ddlLogin.Text != "xxxxx")
            {
                string newPassword = txtPassword2.Text;
                username = ddlLogin.Text.ToString();
                string currentPassword = ddlLogin.SelectedValue.ToString();
                currentPassword = newPassword;
                SqlConnection connection = new SqlConnection(xxxxxxxx);
                SqlCommand cmd = new SqlCommand();
                cmd.CommandType = CommandType.Text;
                cmd.CommandText = "UPDATE Employees SET [Password] = @password WHERE [Login] = @login";
                cmd.Parameters.AddWithValue("@password", currentPassword);
                cmd.Parameters.AddWithValue("@login", username);
                cmd.Connection = connection;

                connection.Open();
                cmd.ExecuteNonQuery();
                MessageBox.Show("Password successfully updated");
                connection.Close(); 


            }

            else
            {
                MessageBox.Show("You either choose usernames  rruales or xxxxx or xxxx, or the passwords don't match, try again");
            }
        }

        private void btnClose_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}

The code does what it needs to do, when a user selects a user name from the dropdown menu, they can reset the user's password.But if the user types the username they want to reset, I get an error here:

string currentPassword = ddlLogin.SelectedValue.ToString();

the error says Object reference not set to an instance of an object.use the "new" keyword to create an object instance.I understand the error is coming from the fact that the user is inputting the username instead of selecting it. my question is and I don't need code, I want to understand how I can go ahead and handle that, where the user wants to just type the username or pick it from the dropdown?any advise to rewrite the code is welcome, I am an entry level developer.

update, I can't answer my own question, but it works now thanks all

All, thank you for your help. what you all said worked, and I also had to do 1 change to my code, I realized I was doing something very dumb:

    private void txtPassword1_TextChanged(object sender, EventArgs e)
    {
         password1 = txtPassword1.Text;

    }

    private void txtPassword2_TextChanged(object sender, EventArgs e)
    {
         password2 = txtPassword2.Text;
    }

    private void btnReset_Click(object sender, EventArgs e)
    {
        if (ddlLogin.SelectedValue == null)
        {
            username = ddlLogin.Text.ToString();
        }
        else
        {
            username = ddlLogin.Text.ToString();
        }

        if (ddlLogin.Text == "rruales" || ddlLogin.Text == "xxxxx" || ddlLogin.Text == "xxxxxx")
        {
            MessageBox.Show("Cannot change this user's password");

        }
        if (password1 == password2 && ddlLogin.Text != "rruales" && ddlLogin.Text != "xxxxxx" && ddlLogin.Text != "xxxxxx")
        {
            string newPassword = txtPassword2.Text;



            //username = ddlLogin.Text.ToString();
           // string currentPassword = ddlLogin.SelectedValue.ToString();


            currentPassword = newPassword;
            SqlConnection connection = new SqlConnection(xxxxxx);
            SqlCommand cmd = new SqlCommand();
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = "UPDATE Employees SET [Password] = @password WHERE [Login] = @login";
            cmd.Parameters.AddWithValue("@password", currentPassword);
            cmd.Parameters.AddWithValue("@login", username);
            cmd.Connection = connection;

            connection.Open();
            cmd.ExecuteNonQuery();
            MessageBox.Show("Password successfully updated");
            connection.Close(); 


        }

        else
        {
            MessageBox.Show("You either choose usernames  rruales or xxxxx or xxxx, or the passwords don't match, try again");
        }
    }

    private void btnClose_Click(object sender, EventArgs e)
    {
        this.Close();
    }
}

}

I don't know why I did this:

string currentPassword = ddlLogin.SelectedValue.ToString();
Etheryte
  • 24,589
  • 11
  • 71
  • 116
Rakim
  • 167
  • 11
  • 1
    Well if the user types in there is no selected value. so you should check it for null and if so use the text property of the ddl. – TaW Jun 05 '14 at 17:05
  • If the user types the name instead of selecting from the list then the selecteditem property will not be set, it will be null. If this is the case then try to 'find' the item in the list based on the ddlLogin.text property (it appears that I am paraphrasing @TaW) –  Jun 05 '14 at 17:14

1 Answers1

0

If you don't select an item from the DropDown, it's SelectedValue will be null. You should check if it's null. If it is null then get the value from the textbox.

string userName;
if (ddlLogin.SelectedValue == null) {
    userName = theTextBox.Text; 
} else {
    username = theDropDownList.SelectedValue.Text;
}

I'm not sure if it's the username you're trying to get. You mention the exception throws when you type the username but you grab a password from ddlLogin? Whatever you're trying to assign, just check if the dropdown is null like above and assign to the correct variable.

Neil Smith
  • 2,565
  • 1
  • 15
  • 18