[C#] Dostęp do zakładek

0

Próbuję stworzyć edytor tekstu z zakładkami, żebym mógł otworzyć kilka plików na kilku zakładkach. Pierwszą zakładkę stworzyłem w edytorze wizualnym i zawiera ona tylko pole rchText. Do tego zrobiłem toolstripy z buttonami na pogrubienie, kursywę itp. itd.
Mam przycisk, który tworzy nową zakładkę, oto kod:

        
private void tripNowazakladka_Click(object sender, EventArgs e)
        {
            TabPage nowazakladka = new TabPage("nowa"); 
            Zakladki.Controls.Add(nowazakladka);
            RichTextBox rchText = new RichTextBox();
            rchText.Name = "rchText";
            rchText.ContextMenuStrip = contextMenuStrip1;
            rchText.Dock = DockStyle.Fill;
            Zakladki.SelectedTab = nowazakladka;
            nowazakladka.Controls.Add(rchText);
        }

Niby richtextboxy tworzone przez ten przycisk mają tą samą nazwę co pierwszy richtextbox, ale nie mogę się do nich dostać.

Kod przycisku pogrubienia tekstu:

private void tripBold_Click(object sender, EventArgs e)
{
                if (rchText.SelectionFont == null)
                {
                    return;
                }

                FontStyle style = rchText.SelectionFont.Style;

                if (rchText.SelectionFont.Bold)
                {
                    style &= ~FontStyle.Bold;
                }
                else
                {
                    style |= FontStyle.Bold;
                }
                rchText.SelectionFont = new Font(rchText.SelectionFont, style);
                rchText.Select();
            }

Jak go zmodyfikować, żebym działał dla nowo utworzonych zakładek (i ich kontrolek)? Jak już będę wiedział to, to poradzę sobie z resztą przycisków.

I jeszcze mam event textchanged dla mojego pierwszego richtextboxa:

private void rchText_TextChanged(object sender, EventArgs e)
        {
            int dlugosc = rchText.TextLength;
            lblIloscZnakow.Text = "Znaki: " + Convert.ToString(dlugosc); //label pokazujący ilość znaków w tekście
            if (rchText.SelectionFont.Bold)
            {
                tripBold.Checked = true;
            }
            else
            {
                tripBold.Checked = false;
            }
        }

Chcę żeby ten event również 'obowiązywał' dla tych nowych richtextboxów.

Jak to zrobić?

0

Nazwa obiektu, a właściwość "Name" to dwie różne rzeczy.
Żeby działało zdarzenie, w metodzie dodającej nową zakładkę dodaj:

rchText.TextChanged += new EventHandler(rchText_TextChanged);

I musisz też w obsłudze zdarzenia korzystać z parametru sender, bo w tej chwili odwołujesz się do pierwszego richEdita, niezależnie w którym zajdzie zdarzenie.
Na początku dodaj:

RichTextBox rchText = (RichTextBox)sender;
0

No super, pokazywanie znaków w richtextboxie działa. Tylko że pogrubianie nie działa. Domyślam się, że trzeba zrobić obsługę zdarzenia, tak jak

rchText.TextChanged += new EventHandler(rchText_TextChanged);
tylko nie wiem co wpisać po kropce...

0

Musisz z aktualnie otwartej zakładki (kolekcja Controls) wziąć kontrolkę z typem RichTextBox.

Nie napiszę już ci tego, bo nie jestem w stanie. Rano...

0

Okej, czekam dalej :)

0

Na usprawiedliwienie powiem, że rano bolała mnie głowa ;).

Na początku tripBold_Click dodaj:

RichTextBox rchText = Zakladki.SelectedTab.Controls.OfType<RichTextBox>().First();

ewentualnie

RichTextBox rchText = (RichTextBox)Zakladki.SelectedTab.Controls["rchText"];

Tylko w drugim wypadku pamiętaj, żeby zostawić ustawienie właściwości Name przy dynamicznym tworzeniu kolejnych kontrolek.

0

Super, wszystko działa tak jak chciałem. Wielkie dzięki za pomoc!

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