First thing I would do is restructure the query to put the various AND statements in brackets;
e.g.
cmd = new SqlCommand("SELECT (invoiceNo) as [Invoice No],
(InvoiceDate) as [Invoice Date],
(Sales.CustomerID) as [Customer ID],
(CustomerName) as [Customer Name],
(GrandTotal) as [Grand Total],
(TotalPayment) as [Total Payment],
(PaymentDue) as [Payment Due]
FROM Sales,Customer
WHERE (Sales.CustomerID = Customer.CustomerID)
AND (InvoiceDate BETWEEN #" + DateTimePicker2.Text + "#
AND #" + DateTimePicker1.Text + "#)
AND (PaymentDue > 0)
ORDER BY InvoiceDate desc"
, con);
Check the date fields to make sure you haven't got the later one before the early one.
Also, Format the DateFields to make sure they are appearing correctly to SQL. i always format to YYYY-MMM-DD so there is always no ambiguity.
Did you test the two seperate parts? i.e. the Sales data and the Customer data using known variables? then join the two parts together to test as a complete query.