Avatar billede majbom Novice
08. august 2007 - 11:56 Der er 8 kommentarer og
1 løsning

problemer med enter-tryk

hejsa exps

jeg har et listview hvor man, på et selected item, kan trykker "Enter" for at lægge én til en af subitems'ne, det virker fint nok.
men jeg har en messagebox der kommer op, hvis tallet kommer over 20, og når man så trykker "Enter" i den for at lukke den, lukker den boksen og "trykker" "Enter" i listviewet igen, så den står faktisk i en løkke dér, medmindre man trykker "ok" med musen eller space...

hvad gør man lige i sådan en situation?
Avatar billede nielle Nybegynder
08. august 2007 - 12:01 #1
Hvordan ser din kode ud?
Avatar billede majbom Novice
08. august 2007 - 12:37 #2
private void lvwReceivers_SelectedIndexChanged(object sender, EventArgs e)
        {
            Font b_font = new Font("Sans Serif", 8, FontStyle.Bold);
            Font n_font = new Font("Sans Serif", 8, FontStyle.Regular);
            //lvwReceivers.Font = n_font;

            foreach (ListViewItem b_item in lvwReceivers.Items)
            {
                b_item.Font = n_font;
            }

            foreach (ListViewItem item in lvwReceivers.SelectedItems)
            {
                item.Font = b_font;
                selId = Convert.ToInt32(item.SubItems[0].Text.ToString());
            }
            string strExpr;
            strExpr = "id = '" + selId + "'";

            // Use the Select method to find all rows matching the filter.
            DataRow[] foundRows = data.Tables[0].Select(strExpr);

            lblLabels.Text = foundRows[0][5].ToString();
        }


private void plusLabel()
        {
           
            string strExpr;
            strExpr = "id = '" + selId + "'";

            // Use the Select method to find all rows matching the filter.
            DataRow[] foundRows = data.Tables[0].Select(strExpr);
            if (Convert.ToInt32(foundRows[0][5].ToString()) >= 20)
            {
                MessageBox.Show("Der kan ikke laves mere end 20 labels til hver modtager", "For mange labels", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
            else
            {
                foundRows[0][5] = Convert.ToInt32(foundRows[0][5].ToString()) + 1;
                lblLabels.Text = foundRows[0][5].ToString();
            }
        }


private void minusLabel()
        {
            string strExpr;
            strExpr = "id = '" + selId + "'";

            // Use the Select method to find all rows matching the filter.
            DataRow[] foundRows = data.Tables[0].Select(strExpr);
            if (Convert.ToInt32(foundRows[0][5]) <= 0)
            {
                MessageBox.Show("Der kan ikke laves mindre end 0 labels til hver modtager", "For lidt labels", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
            else
            {
                foundRows[0][5] = Convert.ToInt32(foundRows[0][5].ToString()) - 1;
                lblLabels.Text = foundRows[0][5].ToString();
            }
        }


private void lvwReceivers_KeyUp(object sender, KeyEventArgs e)
        {
            switch (e.KeyCode)
            {
                case Keys.Back:
                    minusLabel();
                    break;
                case Keys.Enter:
                    plusLabel();
                    break;
                case Keys.Add:
                    plusLabel();
                    break;
                case Keys.Subtract:
                    minusLabel();
                    break;
            }
        }


det skulle være dét :)
Avatar billede nielle Nybegynder
08. august 2007 - 13:05 #3
Ret din plusLabel til at returnere en værdi om det gik godt:

private bool plusLabel()
{
    string strExpr;
    strExpr = "id = '" + selId + "'";

    // Use the Select method to find all rows matching the filter.
    DataRow[] foundRows = data.Tables[0].Select(strExpr);
    if (Convert.ToInt32(foundRows[0][5].ToString()) >= 20)
    {
        MessageBox.Show("Der kan ikke laves mere end 20 labels til hver modtager", "For mange labels", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
        return false;
    }
    else
    {
        foundRows[0][5] = Convert.ToInt32(foundRows[0][5].ToString()) + 1;
        lblLabels.Text = foundRows[0][5].ToString();
        return true;
    }
}

Og ret din KeyUp-eventhandler til at reagere på denne

private void lvwReceivers_KeyUp(object sender, KeyEventArgs e)
{
    switch (e.KeyCode)
    {
        case Keys.Back:
            minusLabel();
            break;
        case Keys.Enter:
            plusLabel();
            break;
        case Keys.Add:
            if (!plusLabel())
                e.SuppressKeyPress = true;
            break;
        case Keys.Subtract:
            minusLabel();
            break;
    }
}
Avatar billede majbom Novice
09. august 2007 - 11:01 #4
tak ,det virker næsten :)

jeg har sat if-sætningen ind i alle cases i min switch, men den virker ikke ved min "Keys.Enter" case...
Avatar billede nielle Nybegynder
09. august 2007 - 11:15 #5
Hvordan ser din kode ud nu?

Og hvordan initialisere du egentligt dit data DataSet?
Avatar billede majbom Novice
09. august 2007 - 11:37 #6
private bool plusLabel()
        {

            if (selId != 0)
            {
                string strExpr;
                strExpr = "id = '" + selId + "'";

                // Use the Select method to find all rows matching the filter.
                DataRow[] foundRows = data.Tables[0].Select(strExpr);
                if (Convert.ToInt32(foundRows[0][5].ToString()) >= 20)
                {
                    MessageBox.Show("Der kan ikke laves mere end 20 labels til hver modtager", "For mange labels", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    return false;
                }
                else
                {
                    foundRows[0][5] = Convert.ToInt32(foundRows[0][5].ToString()) + 1;
                    lblLabels.Text = foundRows[0][5].ToString();
                    return true;
                }
            }
            else
            {
                MessageBox.Show("Der er ikke valgt modtager", "Modtager ikke valgt", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return false;
            }
        }

        private bool minusLabel()
        {
            if (selId != 0)
            {
                string strExpr;
                strExpr = "id = '" + selId + "'";

                // Use the Select method to find all rows matching the filter.
                DataRow[] foundRows = data.Tables[0].Select(strExpr);
                if (Convert.ToInt32(foundRows[0][5]) <= 0)
                {
                    MessageBox.Show("Der kan ikke laves mindre end 0 labels til hver modtager", "For lidt labels", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    return false;
                }
                else
                {
                    foundRows[0][5] = Convert.ToInt32(foundRows[0][5].ToString()) - 1;
                    lblLabels.Text = foundRows[0][5].ToString();
                    return true;
                }
            }
            else
            {
                MessageBox.Show("Der er ikke valgt modtager", "Modtager ikke valgt", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return false;
            }
        }




private void lvwReceivers_KeyUp(object sender, KeyEventArgs e)
        {
            switch (e.KeyCode)
            {
                case Keys.Back:
                    if(!minusLabel())
                        e.SuppressKeyPress = true;
                    break;
                case Keys.Enter:
                    if(!plusLabel())
                        e.SuppressKeyPress = true;
                    break;
                case Keys.Add:
                    if (!plusLabel())
                        e.SuppressKeyPress = true;
                    break;
                case Keys.Subtract:
                    if(!minusLabel())
                        e.SuppressKeyPress = true;
                    break;
            }


init af datasettet:

private void frm_main_Load(object sender, EventArgs e)
        {
            //init_lvwReceivers();
            string filename = "stores.xml";

            //Create a FileStream to the Xml Database file in Read mode
            FileStream findata;

            try
            {
                findata = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);

                //Read the DataBase into the DataSet
                data.ReadXml(findata);

                //Set primary key
                DataColumn[] keys = new DataColumn[1];
                DataColumn column = data.Tables[0].Columns[0];
                keys[0] = column;
                data.Tables[0].PrimaryKey = keys;

                //Close the FileStream
                findata.Close();
            }
            catch (System.IO.FileNotFoundException)
            {
                addTable();
            }
            catch (System.IndexOutOfRangeException)
            {
                addTable();
            }

            //Show stores
            if (data.Tables[0].Rows.Count > 0)
            {
                getReceivers();
            }
            lblLabels.Text = "0";
        }

        private void addTable()
        {
            data.DataSetName = "stores";
            data.Tables.Add("store");
            data.Tables["store"].Columns.Add("id");
            data.Tables["store"].Columns.Add("name");
            data.Tables["store"].Columns.Add("address");
            data.Tables["store"].Columns.Add("zip");
            data.Tables["store"].Columns.Add("phone");
            data.Tables["store"].Columns.Add("labels");
            DataColumn[] keys = new DataColumn[1];
            DataColumn column = data.Tables["store"].Columns["id"];
            keys[0] = column;
            data.Tables["store"].PrimaryKey = keys;
        }
Avatar billede nielle Nybegynder
10. august 2007 - 10:36 #7
Hmm, hvis jeg skal have en kørende demo op, må jeg nok bede om lidt mere:

(o) Eksempel på formatet af: stores.xml (du er velkommen til at anonymisere det).
(o) Koden for getReceivers();
(o) Hvordan lvwReceivers initialiseres / bindes til data-datasettet?

Det undre mig forresten lidt at det er KeyUp og ikke KeyDown du reagere på. Hvorfor?

Endeligt vil jeg foreslå en lille ændring af din eksisterende kode:

        private void plusLabel(KeyEventArgs e)
        {
            if (selId != 0)
            {
                string strExpr;
                strExpr = "id = '" + selId + "'";

                // Use the Select method to find all rows matching the filter.
                DataRow[] foundRows = data.Tables[0].Select(strExpr);
                if (Convert.ToInt32(foundRows[0][5].ToString()) >= 20)
                {
                    MessageBox.Show("Der kan ikke laves mere end 20 labels til hver modtager", "For mange labels", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    e.SuppressKeyPress = true;
                }
                else
                {
                    foundRows[0][5] = Convert.ToInt32(foundRows[0][5].ToString()) + 1;
                    lblLabels.Text = foundRows[0][5].ToString();
                }
            }
            else
            {
                MessageBox.Show("Der er ikke valgt modtager", "Modtager ikke valgt", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                e.SuppressKeyPress = true;
            }
        }

        private void minusLabel(KeyEventArgs e)
        {
            if (selId != 0)
            {
                string strExpr;
                strExpr = "id = '" + selId + "'";

                // Use the Select method to find all rows matching the filter.
                DataRow[] foundRows = data.Tables[0].Select(strExpr);
                if (Convert.ToInt32(foundRows[0][5]) <= 0)
                {
                    MessageBox.Show("Der kan ikke laves mindre end 0 labels til hver modtager", "For lidt labels", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    e.SuppressKeyPress = true;
                }
                else
                {
                    foundRows[0][5] = Convert.ToInt32(foundRows[0][5].ToString()) - 1;
                    lblLabels.Text = foundRows[0][5].ToString();
                }
            }
            else
            {
                MessageBox.Show("Der er ikke valgt modtager", "Modtager ikke valgt", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                e.SuppressKeyPress = true;
            }
        }

        private void lvwReceivers_KeyUp(object sender, KeyEventArgs e)
        {
            switch (e.KeyCode)
            {
                case Keys.Back:
                    minusLabel(e);
                    break;
                case Keys.Enter:
                    plusLabel(e);
                    break;
                case Keys.Add:
                    plusLabel(e);
                    break;
                case Keys.Subtract:
                    minusLabel(e);
                    break;
            }
        }
Avatar billede majbom Novice
10. august 2007 - 11:28 #8
Jeg har valgt at fjerne den messagebox, for jeg synes den var irriterende, så det hele er egentlig lige meget :)

jeg ved heller ikke hvorfor jeg har brugt key_up, det er rettet til key_down...

smid et svar, for det virkede jo *næsten* :)
Avatar billede nielle Nybegynder
10. august 2007 - 11:32 #9
Svar :^)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester