Wyśiwetlanie danych w apliakcji okienkowej C#

0

Poniżej zamieszczam fragment kodu, do którego mam następujące pytanie:
chciałabym wyświetlić wyliczone dane "result", stosuję do tego: MessageBox.Show("Estymowany zasięg lotu silnikowego wynosi: " + result + " m"+"\n" + "Przewidywana długość lotu: " + Tsilmin + " min"). Jednak wyskakuje mi nie jedno okienko, a kilkanaście z tym wynikiem lub komunikat z System.Windows.Forms.MessageBox.Show("Aby wysłać bajt musisz ustanowić połączenie"). Mógłby mi ktoś pomóc?
Również nie do końca rozumiem linijki: port.Write(tosend, 0, 1) w metodzie butSend_Click.
I jeszcze jedno pytanie jeżeli chciałabym wyświetlić dane w terminalu w aplikacji okienkowej (rtbTerminal) za pomocą metody WpiszOdebrane, jak powinny wyglądać komendy?? Próbowałam coś takiego: DodajKolorowy(rtbTerminal, "Zasięg:"+ result.ToString(), System.Drawing.Color.Blue); Ale result nie ejst zdefiniowany dla tej metody i nie działa :(
Dodatkowo jak wyświetlić dane tylko z jednego handlera, którego nazwa została wybrana w combox?
Bardzo dziękuję Wam za pomoc!

namespace TutorialCOM
{
public partial class TutorialCOM : Form
{
System.IO.Ports.SerialPort port;
delegate void Delegat1();
Delegat1 moj_del1;

    public TutorialCOM()
    {
        InitializeComponent();
        port = new SerialPort();
        port.ReadTimeout = 500;
        port.WriteTimeout = 500;

        Opcje.Enter += new EventHandler(Opcje_Enter);
        port.DataReceived += new SerialDataReceivedEventHandler(DataRecievedHandler);
        port.DataReceived += new SerialDataReceivedEventHandler(DataRecievedHandler1);
        port.DataReceived += new SerialDataReceivedEventHandler(DataRecievedHandler2);
        moj_del1 = new Delegat1(WpiszOdebrane);

        comboBox1.Items.Add("Statek powietrzny z silnikiem spalinowym");
        comboBox1.Items.Add("Statek powietrzny z silnikiem elektrycznym");
        comboBox1.Items.Add("Szybowiec");
    }

    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (comboBox1.SelectedItem.ToString() == "Statek powietrzny z silnikiem spalinowym")
        {
            port.DataReceived += new SerialDataReceivedEventHandler(DataRecievedHandler);
        }
        else if (comboBox1.SelectedItem.ToString() == "Statek powietrzny z silnikiem elektrycznym")
        {
            port.DataReceived += new SerialDataReceivedEventHandler(DataRecievedHandler1);
        }
        else if (comboBox1.SelectedItem.ToString() == "Szybowiec")
        {
            port.DataReceived += new SerialDataReceivedEventHandler(DataRecievedHandler2);
        }
    }
    
    private void DataRecievedHandler(object sender, SerialDataReceivedEventArgs e)
    {
         //.....
       //(ALGORYTM OBLICZAJACY
        //wyniki

        double S;
        S = Math.Sqrt((Sxwynik * Sxwynik) + (Sywynik * Sywynik));

        string result = S.ToString();
        MessageBox.Show("Estymowany zasięg lotu silnikowego wynosi: " + result + " m"+"\n" + "Przewidywana długość lotu: " + Tsilmin + " min");

    }

    private void DataRecievedHandler1(object sender, SerialDataReceivedEventArgs e)
    {           
         //.....
       //ALGORYTM OBLICZAJACY
        //wyniki
        double S;
        S = Math.Sqrt((Sxwynik * Sxwynik) + (Sywynik * Sywynik));

        string result = S.ToString();
        MessageBox.Show("Estymowany zasięg lotu akumulatorowego wynosi: " + result + " m\n" + "Przewidywana długość lotu: " + Telmin + " min");

    }

    private void DataRecievedHandler2(object sender, SerialDataReceivedEventArgs e)
    {
       //.....
       //(ALGORYTM OBLICZAJACY
        //wyniki
        double S;
        S = Math.Sqrt((Sxwynik * Sxwynik) + (Sywynik * Sywynik));

        string result = S.ToString();
       MessageBox.Show("Estymowany zasięg lotu ślizgowego wynosi: " + result + " m\n" + "Przewidywana długość lotu:" + Tslizgmin + " min");

    }

    private void WpiszOdebrane()
    {
        
    // DodajKolorowy(rtbTerminal, "Zasięg:"+ moj_del1.ToString(), System.Drawing.Color.Blue);
    //DodajKolorowy(rtbTerminal, ((Int32)numericSend.Value).ToString() + " ", System.Drawing.Color.Black);

}

    private void butSend_Click(object sender, EventArgs e)
    {
        if (port.IsOpen)
        {
            Byte[] tosend = { (Byte)numericSend.Value, (Byte)numericSend2.Value, (Byte)numericSend3.Value, (Byte)numericSend4.Value, (Byte)numericSend7.Value, (Byte)numericSend8.Value, (Byte)numericSend5.Value, (Byte)numericSend6.Value, (Byte)numericSend9.Value, (Byte)numericSend10.Value, (Byte)numericSend11.Value };
            port.Write(tosend, 0, 1);   
        }
        else System.Windows.Forms.MessageBox.Show("Aby wysłać bajt musisz ustanowić połączenie");
    }

}

0

Okienka wyskakują ci za każdym razem, gdy odbierania danych z portu, stąd wiele razy odpalany jest MessageBox

0
a_s_f napisał(a):

Okienka wyskakują ci podczas odbierania danych z portu, stąd wiele razy odpalany jest MessageBox

A można tego uniknąć?

0

Można to rozwiązać na kilka sposobów, zależy co dokładnie potrzebujesz.

Np, Możesz pokazywać wynik po naciśnięciu w przycisk, lub odłączyć zdarzenie po sczytaniu wyniku. Zależy od tego czego potrzebujesz.

0
cSharpKazik napisał(a):

Można to rozwiązać na kilka sposobów, zależy co dokładnie potrzebujesz.

Np, Możesz pokazywać wynik po naciśnięciu w przycisk, lub odłączyć zdarzenie po sczytaniu wyniku. Zależy od tego czego potrzebujesz.

screenshot-20180124141858.png
Mam taką aplikację jak na zdjęciu, wprowadzam dane, na podstawie których algorytm wykonuje pewne obliczenia i dostaje wynik, któy najchętniej chciałabym wyświetlić w terminalu "Dane", już nie korzystając z MessageBox.

1

Zamiast wyrzucać dane do okienka z komunikatem, to zrób sobie wrzucanie danych do tego texBoxa.
Coś w rodzaju(trzeba to ładniej przerobić):

textBox1.Text += "Estymowany zasięg lotu ślizgowego wynosi: " + result + " m\r\n" + "Przewidywana długość lotu:" + Tslizgmin + " min\r\n";
0
a_s_f napisał(a):

Zamiast wyrzucać dane do okienka z komunikatem, to zrób sobie wrzucanie danych do tego texBoxa.
Coś w rodzaju(trzeba to ładniej przerobić):

textBox1.Text += "Estymowany zasięg lotu ślizgowego wynosi: " + result + " m\r\n" + "Przewidywana długość lotu:" + Tslizgmin + " min\r\n";

Super dzięki!
Jednak nadal mam problem, że w okienku wyświetla mi się odpowiedź kilka razy ze względu na tą wysyłaną ilość bitów, wiesz jak to rozgryźć?

Plus w zależności od opcji wybranej w ComboBox chciałabym wyświetlać tylko ten wynik z metody, która została aktywowana w zależności od tekstu w combobox. Obecnie wyniki ze wsyztskich trzech opcji się wyświetlają :/

Pomóżcie, proszę!!!!

0

taka szybka piłka czemu nie stworzysz sobie jednej funkcji do tych obliczeń, tylko masz 3 takie same? może dlatego masz kilka wyników :)

private void DataRecievedHandler(object sender, SerialDataReceivedEventArgs e)
private void DataRecievedHandler1(object sender, SerialDataReceivedEventArgs e)
private void DataRecievedHandler2(object sender, SerialDataReceivedEventArgs e)

możesz zamiast tych ifów w comboboxie zrobić coś takiego

         var index = comboBox1.SelectedIndex;

            switch (index)
            {
                case 0:
                    MessageBox.Show(comboBox1.Text);

                    break;
                case 1:
                    MessageBox.Show(comboBox1.Text);
                    break;
                case 2:
                    MessageBox.Show(comboBox1.Text);
                    break;
                        
            }
0
Kubuś Puchatek napisał(a):

taka szybka piłka czemu nie stworzysz sobie jednej funkcji do tych obliczeń, tylko masz 3 takie same? może dlatego masz kilka wyników :)

private void DataRecievedHandler(object sender, SerialDataReceivedEventArgs e)
private void DataRecievedHandler1(object sender, SerialDataReceivedEventArgs e)
private void DataRecievedHandler2(object sender, SerialDataReceivedEventArgs e)

możesz zamiast tych ifów w comboboxie zrobić coś takiego

         var index = comboBox1.SelectedIndex;

            switch (index)
            {
                case 0:
                    MessageBox.Show(comboBox1.Text);

                    break;
                case 1:
                    MessageBox.Show(comboBox1.Text);
                    break;
                case 2:
                    MessageBox.Show(comboBox1.Text);
                    break;
                        
            }

Każda z moich funkcji, różnią się cyferką w nazwie zawiera inne obliczenia, w zależności od wybranego ComboBoxa. I chciałabym wyświetlać tylko dane z tej funckji która za pomocą if została wybrana.

0
Ewelina J napisał(a):
a_s_f napisał(a):

Zamiast wyrzucać dane do okienka z komunikatem, to zrób sobie wrzucanie danych do tego texBoxa.
Coś w rodzaju(trzeba to ładniej przerobić):

textBox1.Text += "Estymowany zasięg lotu ślizgowego wynosi: " + result + " m\r\n" + "Przewidywana długość lotu:" + Tslizgmin + " min\r\n";

Super dzięki!
Jednak nadal mam problem, że w okienku wyświetla mi się odpowiedź kilka razy ze względu na tą wysyłaną ilość bitów, wiesz jak to rozgryźć?

Plus w zależności od opcji wybranej w ComboBox chciałabym wyświetlać tylko ten wynik z metody, która została aktywowana w zależności od tekstu w combobox. Obecnie wyniki ze wsyztskich trzech opcji się wyświetlają :/

Pomóżcie, proszę!!!!

Wyświetlają się dlatego, że w konstruktorze podpinasz do zdarzenia 3 różne metody:


        port.DataReceived += new SerialDataReceivedEventHandler(DataRecievedHandler);
        port.DataReceived += new SerialDataReceivedEventHandler(DataRecievedHandler1);
        port.DataReceived += new SerialDataReceivedEventHandler(DataRecievedHandler2);

Musisz to usunąć.

1 użytkowników online, w tym zalogowanych: 0, gości: 1