Autor Beitrag
Oski
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Sa 10.12.11 20:41 
Hallo,

ich bin neu hier und habe eine Frage. Ich bin mir auch nicht ganz sicher wonach ich genau suchen sollte. Bin noch recht unerfahren mit der Programmierung in C#.

Ich habe ein Projekt begonnen in dem ich mehrer TabPages habe. Auf der ersten Seite kann man eine Auswahl treffen damit im Zweiten Tab in dem wieder ein Main TabControl liegt geziehlt Tabs erstellt werden. Dies funktioniert nur so leider nicht. Ich muss am Anfang erst den zweiten Tab einmal gesehen haben sonst werden die Tabs garnicht erst erstellt. Kann ich das auch irgendwie anders lösen?
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
 private void addTab(string name, string text, int ti)
        {

            ZurPerson.Show();
            Eckdaten.Show();
            //Tab erstellen
            TabPage tab = new TabPage();


            if (ti >= PersonenTabControl.TabCount)
            {
                ti = PersonenTabControl.TabCount;
            }
           

            tab.Location = new System.Drawing.Point(422);
            tab.Name = name;
            tab.Padding = new System.Windows.Forms.Padding(3);
            tab.Size = new System.Drawing.Size(463335);
            tab.TabIndex = ti;
            tab.Text = text;
            tab.UseVisualStyleBackColor = true;


            PersonenTabControl.TabPages.Insert(ti, tab);

            //name Label erstellen

            Label namelabel = new Label();

            namelabel.Location = new System.Drawing.Point(422);
            namelabel.Name = "name" + name + "label";
            namelabel.Padding = new System.Windows.Forms.Padding(3);
            //namelabel.Size = new System.Drawing.Size(463, 335);
            namelabel.Text = "Name "+name;

            tab.Controls.Add(namelabel);

            TextBox nametextbox = new TextBox();

            nametextbox.Location = new Point(1504);
            nametextbox.Name = "name" + name;
            nametextbox.Text = name;

            tab.Controls.Add(nametextbox);

        }


Das ist der Code zum erstellen der TabPage.

Mit dem Wechsel am Anfang zwischen den Tabs kann ich das Problem zwar lösen aber ich kann mir nicht vorstellen das das die einzige Lösung des Problems ist.


EDIT
___________


Zur genaueren Beschreibung:

ich schreibe einen Rechner. Im ersten tab "Eckdaten" kann man seinen Familienstand und die Anzahl der Kinder eintragen. Wenn sich einer dieser Werte ändert sollen im Zweiten Tab "ZurPerson" in einem neuen TabControl die einzelnen Personen als Tabs gelistet werden wo dann die Daten der Personen abgefragt werden.

Jetzt habe ich gleich das nächste Problem. In den Tabs die erstellt werden, wird oben ein Textfeld erstellt indem man den Namen der Person eimtragen kann. Wenn ich nun einen Eventhandler für die textbox erstelle, wie bekomme ich raus welche der erstellten textboxen das event ausgelöst hat? Ich habe es sowohl übers sender probiert als auch über e. ich kann beides nur als Strimg ausgeben und nichts davon hilft mir weiter.

LG

Oski

Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 11.12.11 11:45 
Hallo Oski :welcome:

genau kann ich deinen Fehler nicht nachvollziehen.
Probiere mal statt der Insert-Methode (welchen Index 'ti' übergibst du denn?) mal:
ausblenden C#-Quelltext
1:
PersonenTabControl.TabPages.Add(tab);					

Und die Eigenschaft "tab.TabIndex" solltest du nicht verwenden (da diese für das TabControl laut MSDN nicht unterstützt wird).

Und deine zweite Frage bzgl. dem Event-Handler. Dort kannst du den 'sender' in das Control 'casten':
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
void textbox_TextChanged(object sender, EventArgs e)
{
  TextBox textbox = sender as TextBox;
  if (textbox != null// Abfrage, ob wirklich eine TextBox übergeben wurde
  {
    // auf textbox zugreifen, z.B.
    string text = textbox.Text;
  }
}
Oski Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: So 11.12.11 13:01 
Hallo TH,

danke für deine Antwort. Mit add habe ich auch schon gemacht. Das funktioniert zwar nur kann ich dann nicht die Position des Tabs bestimmen. ti ist 1 da ein Tab standardmäßig schon exestiert. Es geht darum das Der Partner der ausfüllenden Person an zweiter Stelle stehen soll und dann erst die Kinder. Wenn aber erst die kinder gewählt werden und dann der Familienstand wird per add der partner ganz hinten angehängt.

LG

Rudi
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 11.12.11 13:52 
Ok, dann solltest du beides einsetzen (Insert für 0 bis N-1 und Add für N):
ausblenden C#-Quelltext
1:
2:
3:
4:
if (ti < PersonenTabControl.TabCount)
    PersonenTabControl.TabPages.Insert(ti, tab);
else
    PersonenTabControl.TabPages.Add(tab);
Oski Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: So 11.12.11 14:21 
Das ist auch ein Weg. Der führt jedoch wieder zum selben Ergebnis. Solange add verwendet wird klappt alles. Die Tabs werden erstellt. Sobald aber die insert Variante verwendet wird und der Tab danach erst gewechselt wird wurde der Tab nicht erstellt.
In meinem Fall ich wähle erst vier Kinder. Also werden im Tab "ZurPerson" 4 Tabs erstellt "Kind 1", "Kind 2", "Kind 3" und "Kind 4".
Anschließend wähle ich als Familienstand "Verheiratet". Nun soll der Tab "Partner" mit insert bei 1 eingefügt werden damit er an zweiter Stelle steht. Dies geschieht aber nur wenn ich vorher schoneinmal den Tab "ZurPerson" gewählt hatte. Warum das so ist leuchtet mir noch nicht ganz ein. Fest steht das ich mir schonmal den tab.count über messagebox ausgegeben habe und diese Tabs wenn vorher nicht "ZurPerson" gwählt wurde wirklich nicht erstellt werden. Der Conut bleibt unbeharrlich auf 1 für den ersten Tab der ja schon vorgegeben ist. Deswegen habe ich am Anfang ZurPerson.Show(); Eckdaten.Schow(); geschrieben. Es fällt zwar nicht auf das der Tab dann zu Beginn gewechselt wird, aber ich empfinde diese Variante bestenfallst als workarround und es beseitigt ja nicht den Fehler der ja scheinbar irgendwo steckt.

LG

Oski
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 11.12.11 14:38 
Hallo Oski,

das scheint wirklich ein komplexeres Problem zu sein. Könntest du deinen Code mal hier hochladen? Oder aber eine Beispielanwendung erstellen?

Ich habe bisher bei meinen Projekten mit TabControls AFAIK nie Insert benutzt und kenne daher dieses Problem nicht selber.

Edit: ich habe mal meine Projekte durchsucht und doch einen Treffer gefunden:
ausblenden C#-Quelltext
1:
2:
3:
4:
IntPtr h = this.Handle; // for Insert to work!!!

int nIdx = FindSortedIndex(page.Text);
TabPages.Insert(nIdx, page);


Es liegt also daran, daß intern das TabControl-Handle noch nicht erzeugt wurde.
Du benötigst also noch ein
ausblenden C#-Quelltext
1:
IntPtr handle = PersonenTabControl.Handle;					

vor deinem Insert! (Dies kann man quasi als Bug der Insert-Methode ansehen...)
Oski Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: So 11.12.11 15:09 
Ja super. So funktioniert es. Ist aber auch ein schwieriges Thema wo man auch Probleme hat wonach man genau suchen soll. Naja hoffentlich finden andere mit ähnlichen Problemen diesen Thread.

Danke nochmal.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 11.12.11 15:38 
Ich habe gerade noch mal nachgelesen, daß man alternativ auch die Methode
ausblenden C#-Quelltext
1:
tabControl.CreateControl();					

benutzen kann.

Ich weiß heute auch nicht mehr, wie ich damals bei dem Projekt (Anfang 2009) auf die Lösung gekommen bin (keine drei Jahre her und schon so vergeßlich :gruebel: )