Does your code crash? try putting in some debug messages. Perhaps using MessageBox.Show();
trying checking the HasRows property before the while loop. then in the loop try showing the values of columns 1 and 2 to see if they are what you expect...
MessageBox.show(row.GetString(0) + " " + row.GetString(1));
are the values what you expect?
you should also consider using a WHERE clause in your sql query in order to search for the specific username and password - then you can enable the button based on if the result 'HasRows'
button1.Enabled = row.HasRows;
don't forget to use command parameters (search Google if needed) when you use textbox values to create an SQL where clause (see SQL Injection)
While typing the below code I realised your problem is probably the fact that you are setting CommandBehavior.SingleResult in your ExecuteReader call that means you are only returning the first result. change this to...
row = sqlCommand.ExecuteReader();
connection = new SqlConnection("...");
SqlCommand cmd = new SqlCommand("SELECT ID FROM [dbo].[User] WHERE User = @0 AND Password = @1");
cmd.Parameters.Add("@0", OleDbType.Char).Value = tbxUserID.Text;
cmd.Parameters.Add("@1", OleDbType.Char).Value = tbxPassword.Text;
SqlDataReader reader = cmd.ExecuteReader();
button1.Enabled = reader.HasRows;
MessageBox.Show(ex.Message, "Database Problem", MessageBoxButtons.OK, MessageBoxIcon.Warning);
if(connection != null)