0

What happens is if I have codes inside listBox1_SelectedIndexChanged method, the UI gets stuck every time I press the Add Cash, Save or Refresh Button.

It works fine if I remove the codes inside listBox1_SelectedIndexChanged.

        private void LoadAccounts()
        {
            accounts.Clear();
            accounts = DBAccess.LoadAccounts();
            UpdateListBox();
        }

        private void UpdateListBox()
        {
            listBox1.DataSource = null;
            listBox1.DataSource = accounts;
            listBox1.DisplayMember = "Username";

        }

        private void btnAddCash_Click(object sender, EventArgs e)
        {
            string userName = listBox1.GetItemText(listBox1.SelectedItem);

            if ( Int32.TryParse(txtAddCash.Text, out int cash) )
            {
                DialogResult dr = MessageBox.Show($"Add {txtAddCash.Text} cash to {userName}?", "Add Cash", MessageBoxButtons.YesNo);
                if (dr == DialogResult.No)
                    return;

                AccountModel acc = new AccountModel();

                acc.Username = userName;
                acc.LeftCash = cash;

                DBAccess.AddCash(acc);

                txtAddCash.Text = "";

                LoadAccounts();
            }
        }

        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            string selected = ((AccountModel)listBox1.SelectedItem).Username;
            int leftCash = accounts.Where(a => a.Username == selected).Select(a => a.LeftCash).First();

            lblLeftCash.Text = leftCash.ToString();
        }

I made a short clip on what happens enter image description here

It's like the updated UI is behind the old listbox UI

halfer
  • 19,824
  • 17
  • 99
  • 186
marneee
  • 25
  • 1
  • 3

1 Answers1

0

I have rebuilded your code as good as i can. I used a List as database. I could not reproduce your error but I have got an NullReferenceException at listBox1_SelectedIndexChanged if I don't write

if (listBox1.SelectedItem == null) return;.

Could you try to add this "if" to your SelectedIndexChanged event?

private void LoadAccounts()
{
    accounts.Clear();
    accounts = accountsOnDatabase.ToList();
    UpdateListBox();
}

private void btnAddCash_Click(object sender, EventArgs e)
{
    string userName = listBox1.GetItemText(listBox1.SelectedItem);

    if (int.TryParse(txtAddCash.Text, out int cash))
    {
        DialogResult dr = MessageBox.Show($"Add {txtAddCash.Text} cash to {userName}?", "Add Cash", MessageBoxButtons.YesNo);
        if (dr == DialogResult.No)
            return;

        AccountModel AccOnDataBase = accountsOnDatabase.Where(a => a.Username == userName).FirstOrDefault();
        if (AccOnDataBase == null) return;

        AccountModel acc = new AccountModel();
        acc.Username = userName;
        acc.LeftCash = cash + AccOnDataBase.LeftCash; //DBAccess.AddCash

        accountsOnDatabase.RemoveAll(a => a.Username == acc.Username);
        accountsOnDatabase.Add(acc);

        txtAddCash.Text = "";

        LoadAccounts();
    }
}
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    if (listBox1.SelectedItem == null) return;

    string selected = ((AccountModel)listBox1.SelectedItem).Username;
    int leftCash = accounts.Where(a => a.Username == selected).Select(a => a.LeftCash).First();

    label1.Text = leftCash.ToString();
}
Oliver
  • 93
  • 1
  • 7
  • thanks. it works fine now after adding `if (listBox1.SelectedItem == null) return;` It's kinda odd because I was not getting any null exception error – marneee Jan 31 '20 at 15:25