Problem z tabcontrol, programowe kliknięcie buttona

0

Witam,
Napotkałem problem z TabControl. Mam formatkę, na której umieściłem Tabcontrol (składający się z 5 tabpages). Na każdej zakładce mam coś. Dodałem Menu, w którym mam przykłady (PRZYKŁADY). Jak nacisnę PRZYKŁAD 1, wypełnia mi się wszystko w tabpages + automatycznie powinny się nacisnąć wybrane przeze mnie Buttony. Problem leży w tym, że nie klikają się wszystkie (klikają się tylko te, które są widoczne na Tabpage (...na tych niewidocznych tabepages nie reagują). Co może być tutaj problemem?

0

Pokaż kod.

0
 private void przykład1ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            checkBox1.Checked = false;
            checkBox2.Checked = false;
            checkBox3.Checked = false;
            double x0 = 2;
            double h = 1;
            textBox3.Text = x0.ToString();
            textBox4.Text = h.ToString();
            checkBox1.Checked = true;
            checkBox14.Checked = true;
            button1.PerformClick();

            textBox19.Text = ("-5");
            textBox20.Text = ("8");
            textBox21.Text = ("0,01");
            textBox22.Text = ("-2");
            textBox23.Text = ("6");
            textBox24.Text = ("0,01");
            textBox25.Text = ("0,01");
            textBox26.Text = ("7");
            textBox27.Text = ("-2");

            checkBox15.Checked = true;
            checkBox16.Checked = true;
            checkBox17.Checked = true;
            button3.PerformClick();

Dodam, że button1 to OBLICZ a button3 dotyczy kreślenia wykresu. Jak nacisnę przykład1 i jestem na tabie (dane wejściowe) to naciska mi się programowo button1 a button3 nie naciska się....Kod jest wykonywany poprawnie lecz guzik się nie wciska

0

Wydaje mi się, że prawdopodobnie dlatego, że można wcisnąć jedynie widoczny przycisk. Zamiast wciskać przycisk uruchom bezpośrednio metodę, która jest przez niego wywoływana.

0

Tak tylko, że ja mam przypisane pod niego zdarzenie...tzn gdy w niego kliknę, coś się wykonuje. Stąd mi zależy na tym, żeby programowo można było go kliknąć. Dziwi mnie to, że wszystko mogę uzupełnić programowo, wszystko mogę zaznaczyć programowo a kliknąć już nie mogę;/. A czy mogę jakoś programowo uruchomić to zdarzenie? Czy tylko pozostaje kliknięcie? Zdarzenie wygląda tak:

  private void button3_Click(object sender, EventArgs e)
        {
            if (!String.IsNullOrEmpty(textBox19.Text) && !String.IsNullOrEmpty(textBox20.Text) && !String.IsNullOrEmpty(textBox21.Text) && !String.IsNullOrEmpty(textBox22.Text) && !String.IsNullOrEmpty(textBox23.Text) && !String.IsNullOrEmpty(textBox24.Text) && !String.IsNullOrEmpty(textBox25.Text) && !String.IsNullOrEmpty(textBox26.Text) && !String.IsNullOrEmpty(textBox27.Text))
            {
                if (checkBox1.Checked || checkBox2.Checked || checkBox3.Checked == true)
                {
                    if (checkBox4.Checked || checkBox5.Checked || checkBox6.Checked || checkBox7.Checked || checkBox8.Checked || checkBox9.Checked || checkBox10.Checked || checkBox11.Checked || checkBox12.Checked || checkBox13.Checked == true)
                    {
                        if (!String.IsNullOrEmpty(textBox3.Text) && !String.IsNullOrEmpty(textBox4.Text))
                        {
                            xpocz = double.Parse(textBox19.Text.ToString());
                            xkon = double.Parse(textBox20.Text.ToString());
                            krok = double.Parse(textBox21.Text.ToString());

itd itd...
Czy da się to wywołać programowo?

0
ravers_19 napisał(a)

Tak tylko, że ja mam przypisane pod niego zdarzenie...tzn gdy w niego kliknę, coś się wykonuje.

Tak się nie pisze programów. Kliknięcie przycisku powinno wywołać metodę klasy, która wykonuje żądane operacje i przekazać jej odpowiednie parametry.

A czy mogę jakoś programowo uruchomić to zdarzenie?

Jeśli nie działa button3.PerformClick(), to spróbuj button3_Click(this, EventArgs.Empty).

  private void button3_Click(object sender, EventArgs e)
        {
            if (!String.IsNullOrEmpty(textBox19.Text) && !String.IsNullOrEmpty(textBox20.Text) && !String.IsNullOrEmpty(textBox21.Text) && !String.IsNullOrEmpty(textBox22.Text) && !String.IsNullOrEmpty(textBox23.Text) && !String.IsNullOrEmpty(textBox24.Text) && !String.IsNullOrEmpty(textBox25.Text) && !String.IsNullOrEmpty(textBox26.Text) && !String.IsNullOrEmpty(textBox27.Text))
            {
                if (checkBox1.Checked || checkBox2.Checked || checkBox3.Checked == true)
                {
                    if (checkBox4.Checked || checkBox5.Checked || checkBox6.Checked || checkBox7.Checked || checkBox8.Checked || checkBox9.Checked || checkBox10.Checked || checkBox11.Checked || checkBox12.Checked || checkBox13.Checked == true)
                    {
                        if (!String.IsNullOrEmpty(textBox3.Text) && !String.IsNullOrEmpty(textBox4.Text))
                        {
                            xpocz = double.Parse(textBox19.Text.ToString());
                            xkon = double.Parse(textBox20.Text.ToString());
                            krok = double.Parse(textBox21.Text.ToString());

Masz bardzo twórcze nazwy kontrolek.

0

Sprawdziłem to i działa. Nie wiem czemu ale zawsze pod przyciskiem pisaliśmy to co ma się wydarzyć. Stosuję tylko jedną klasę w której są najważniejsze wiadomości METODY NUMERYCZNEJ. Resztę piszę w pliku formatki. Ogólnie popisałem już trochę programów i zawsze tak pisałem. Nie jestem po informatyce a elektronice i telekomunikacji:). Mógłbyś podać mi jakieś wskazówki dodatkowe jak np ta o której pisałeś post wyżej?. Myślisz, żeby podzielić program na metody i zdarzenia, w których wywoływane są metody? Powiedz mi jeszcze odnośnie kontrolek. Jak je nazwać, żeby czyścić je pętlą? Obecnie muszę każdego textbox i checkbox czyścić z osobna a to zajmuje troszkę miejsca w kodzie...Podaj mi jeszcze jakieś ewentualne wskazówki.

0

1 część programu napisana. Podczas testowania pojawił mi się błąd. Jestem zielony z tego. Mam Formatke2 w której po naciśnięciu buttona wchodzimy w formatkę3. Kod poniżej:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Praca
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void wyjdźToolStripMenuItem_Click_1(object sender, EventArgs e)
        {
            Close();
        }

        public static void ThreadProc()
        {
            Application.Run(new Form3());      <----------tutaj wysypuje się
        }


        private void button1_Click(object sender, EventArgs e)
        {
            this.Close();
            System.Threading.Thread Okno3 = new System.Threading.Thread(new System.Threading.ThreadStart(ThreadProc));
            Okno3.Start();
        }

    }
}
 

Wszystko fajnie chula. Jak wykonam obliczenia w formatce3, narysowany zostanie wykres ZedGraph i przycisnę prawym klawiszem myszy na nim to pokazuje mi się menu. Wszystko działa jak należy poza opcją Save Image As....Gdy to kliknę program się wysypuje w miejscu zaznaczonym strzałką. Informacja jaka pojawia mi się w VS to

Bieżący wątek musi być ustawiony na tryb jednowątkowego apartamentu, aby można było wykonywać wywołania OLE. Upewnij się, że w funkcji Main jest zaznaczony element STAThreadAttribute. Ten wyjątek jest wywoływany tylko wtedy, gdy do tego procesu zostanie dołączony debuger.

Da się te opcję zablokować w ZedGraph? Ewentualnie co sprawić, żeby to hulało? Na bank jest to spowodowane przeze mnie. Gdy mam jedno oknow (formatkę), wszystko działa ok. Gdy przejdę do swojego projektu gdzie mam kilka okien już się chrzani. Może jakoś inaczej wywoływać nowe okna? Posiłkuję się materiałami z internetu, stąd ta metoda wywoływania w kodzie.

0

Mam Formatke2 w której po naciśnięciu buttona wchodzimy w formatkę3.

Nie. Masz tutaj same bzdury. Przeczytaj może najpierw jak wyświetlić drugie okno (podstawy podstaw), potem dowiedz się co to są wątki, jak się je stosuje i po co. To co wkleiłeś powyżej jest zupełnie bez sensu.

0

Możesz polecić jakąś literaturę? Tak jak mówiłem wcześniej sposób wywoływania nowego okna i zamykania starego znalazłem w google.

             Form2 drugie_okienko = new Form2();
            drugie_okienko.Show();
            this.Close();

Coś takiego robiłem ale to "zabija" mi dwa okna

0
ravers_19 napisał(a)

Sprawdziłem to i działa. Nie wiem czemu ale zawsze pod przyciskiem pisaliśmy to co ma się wydarzyć. Stosuję tylko jedną klasę w której są najważniejsze wiadomości METODY NUMERYCZNEJ. Resztę piszę w pliku formatki.

Chodzi o to, że całe przetwarzanie danych, różne obliczenia i algorytmy powinieneś mieć w odpowiednich klasach, a nie w pliku formatki. W nim jedynie wywołujesz odpowiednie klasy i metody, przekazując im dane z kontrolek. Nie umiem tego prościej opisać.

Powiedz mi jeszcze odnośnie kontrolek. Jak je nazwać, żeby czyścić je pętlą? Obecnie muszę każdego textbox i checkbox czyścić z osobna a to zajmuje troszkę miejsca w kodzie...

Nie musisz ich specjalnie nazywać, czyszczenie pętlą jest proste.

foreach (TextBox txt in this.Controls.OfType<TextBox>())
{
    txt.Text = string.Empty;
}

Podaj mi jeszcze jakieś ewentualne wskazówki.

Np. taka książka mogłaby pomóc Ci zrozumieć o co chodzi z dzieleniem programu na klasy: http://helion.pl/ksiazki/analiza-i-projektowanie-obiektowe-rusz-glowa-brett-d-mclaughlin-gary-pollice-david-west,anprob.htm

0

Znalazłem masę przykładów na necie, ale żaden nie działa jak powinno. Albo są to opcje ukrywania okien albo zamykania całości. Żadna z nich nie działa jak chcę. Tzn zamknąć okno i otworzyć nowe. Albo coś się ukrywa, albo zamyka całkiem. Ten kod co podałem powyżej działa tak jak ja chcę ale faktycznie po co uruchamiać proces;/. Widzisz testowałem te pętle i nie czyści mi textboxów:) Tylko ręczne tzn wypisanie każdego z osobna.Clear() działa...

0

Problem z zamykaniem i otwieraniem okien dalej wisi...
Obecnie mam taką procedurę...

         

private void button1_Click(object sender, EventArgs e)
        {
            Form2 frm2 = new Form2();
            frm2.Show();
            frm2.Activate();
            this.Hide();
        }

Wszystko działa ale po zamknięciu [X] program wykonuje się w tle...

0

Po co robisz this.Close(); ?
Może this.Hide() jeśli chcesz ukryć bieżącą formę

0

Sorki pomyliłem kod powinno być this.Hide(). Jednak powoduje to tylko ukrycie tego okna. Gdy jestem w 2 oknie i naciskam [X] wszystko WIZUALNIE się wyłącza ale w rzeczywistości działa dalej. Zauważyłem to podczas kompilacji w VS 2010. Dałem kompilacje, popracowałem z 2 oknem, zamykam a DEBUG działa dalej. Czyli tak naprawdę musiałem schować program poprzez naciśnięcie [X]. Całkowicie da się tylko zamknąć w momencie gdy pracuję na Formie1. Jak już wejdę w druga przy pomocy tej części kodu, która jest powyżej oraz wyłączę formę 2 przez [X]. To program znika ale i tak pracuje w tle;/ Jak tego uniknąć? Czy trzeba przypisać dla [X] funkcję zamykającą całość czy może jest jakieś inne wyjście (dopisanie jakiegoś kodu do tego co mam).

0

Aplikacja WinForms żyje, dopóki nie zamkniesz jej głównego okna, czyli tego uruchomionego metodą Application.Run w metodzie Program.Main. To jest chyba całkiem logiczne. Jeśli aplikacja ma się wyłączać również w inny sposób, to użyj np. Application.Exit().

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