none
Inserir TabItem em um TabControl dentro de outro TabControl em Run-time.... RRS feed

  • Pergunta

  •  

     

    Minha duvida é como fazer com que , após ter criado um TabControl em run time , eu consiga inserir tabitems em um TabControl existente dentro deste TabControl principal.

     

    Antes usava Master Detail com grids da Xceed , mas por necessidade tive que alterar isso e usar TabControls...

     

    -Brunno-

     

    Não entendi muito bem o que disse sobre UserControls...

     

    Obrigado!

    quarta-feira, 12 de novembro de 2008 13:08

Respostas

  • Quando você cria um UserControl, você pode encapsular todo o comportamento de diversos componentes em um só contole e com isso facilitar sua vida.

     

    Por exemplo, você disse que tem diversos contatos, com nome, endereço, e-mail, etc. Se você cria um UserControl com a interface do contato (stackpanel, textboxes, labels, combos, etc), basta incluir o UserControl no TabItem e pronto. Para acessar os dados do contato, basta acessar as propriedades do UserControl.

     

    Quanto a inserir TabControl dentro de um TabControl, dê uma olhada no outro Post, o código que mostrei tem um TabControl dentro de um TabItem de outro TabControl.

     

    Bruno

     

    quarta-feira, 12 de novembro de 2008 14:18
  • Veja este código:

     

    Code Snippet

    TabControl tab2;

    int numItem = 0;

     

    public Window1()

    {

      InitializeComponent();

      StackPanel stackEndereco2 = new StackPanel();

      Content = stackEndereco2;

      Button btn = new Button();

      btn.Click += new RoutedEventHandler(btn_Click);

      btn.Content = "Adiciona";

      stackEndereco2.Children.Add(btn);

      TabControl tab1 = new TabControl();

      TabItem item1 = new TabItem();

      item1.Header = "Item1";

      StackPanel stack1 = new StackPanel();

      item1.Content = stack1;

      tab1.Items.Add(item1);

      stack1.Children.Add(new ComboBox());

      stack1.Children.Add(new TextBox());

      tab2 = new TabControl();

      stack1.Children.Add(tab2);

      stackEndereco2.Children.Add(tab1); //StackPanel

    }

     

     

    Aqui eu declaro meu tab principal e guardo numa variavel privada a referência para o TabControl interno. Note que estou declarando o manipulador para o evento Click do botão. Neste manipulador, adiciono o TabItem. Note que estou adicionando um monte de componentes dentro deste TabItem. O ideal seria criar um User Control e adicionar só ele no TabItem:

     

    Code Snippet

    void btn_Click(object sender, RoutedEventArgs e)

    {

      TabItem item2 = new TabItem();

      numItem++;

      item2.Header = string.Format("Item {0}", numItem);

    // aqui adiciono o tabitem no TabControl (tab2)

      tab2.Items.Add(item2);

      StackPanel stack2 = new StackPanel();

      stack2.Children.Add(new TextBox());

      stack2.Children.Add(new TextBox());

      item2.Content = stack2;

      StackPanel stack3 = new StackPanel();

      stack3.Orientation = Orientation.Horizontal;

      TextBlock text = new TextBlock();

      text.Text = item2.Header.ToString();

      text.Margin = new Thickness(5);

      stack3.Children.Add(text);

      text = new TextBlock();

      text.Text = "Texto no SP Horizontal";

      text.Margin = new Thickness(5);

      stack3.Children.Add(text);

      stack2.Children.Add(stack3);

    }

     

     

    Bruno

    quarta-feira, 12 de novembro de 2008 15:53
  • Você pode fazer algo assim:

     

    Code Snippet

    TabItem tabSelecionado = tab1.SelectedItem;

    TabItem tabSelecionado = (TabItem)tab1.SelectedItem;

    StackPanel stackSelecionado = (StackPanel)tabSelecionado.Content;

    TabControl subTab = null;

    foreach (var filho in stackSelecionado.Children)

    {

      if (filho is TabControl)

      {

        subTab = (TabControl)filho;

        break;

      }

    }

     

    if (subTab != null)

    {

    // Aqui você adiciona os controles em SubTab

       

     

     

    Bruno

    quarta-feira, 12 de novembro de 2008 19:02

Todas as Respostas

  • Quando você cria um UserControl, você pode encapsular todo o comportamento de diversos componentes em um só contole e com isso facilitar sua vida.

     

    Por exemplo, você disse que tem diversos contatos, com nome, endereço, e-mail, etc. Se você cria um UserControl com a interface do contato (stackpanel, textboxes, labels, combos, etc), basta incluir o UserControl no TabItem e pronto. Para acessar os dados do contato, basta acessar as propriedades do UserControl.

     

    Quanto a inserir TabControl dentro de um TabControl, dê uma olhada no outro Post, o código que mostrei tem um TabControl dentro de um TabItem de outro TabControl.

     

    Bruno

     

    quarta-feira, 12 de novembro de 2008 14:18
  •  

    Então a partir daquilo que você me mostrou eu consegui fazer , isso.

     

    Imagine comigo que após isso, ou seja,  após mostra o tabControl dentro de outro....neste TabControl interno a partir do evento de um botão eu precise adicionar TabItems dentro deste TabControl , que está dentro de um TabControl principal...

     

    A primeira parte já consegui fazer...Como você exemplificou para mim, este seria um segundo passo.

     

    Obrigado , pela paciencia e pelo suporte..

    quarta-feira, 12 de novembro de 2008 15:29
  • Veja este código:

     

    Code Snippet

    TabControl tab2;

    int numItem = 0;

     

    public Window1()

    {

      InitializeComponent();

      StackPanel stackEndereco2 = new StackPanel();

      Content = stackEndereco2;

      Button btn = new Button();

      btn.Click += new RoutedEventHandler(btn_Click);

      btn.Content = "Adiciona";

      stackEndereco2.Children.Add(btn);

      TabControl tab1 = new TabControl();

      TabItem item1 = new TabItem();

      item1.Header = "Item1";

      StackPanel stack1 = new StackPanel();

      item1.Content = stack1;

      tab1.Items.Add(item1);

      stack1.Children.Add(new ComboBox());

      stack1.Children.Add(new TextBox());

      tab2 = new TabControl();

      stack1.Children.Add(tab2);

      stackEndereco2.Children.Add(tab1); //StackPanel

    }

     

     

    Aqui eu declaro meu tab principal e guardo numa variavel privada a referência para o TabControl interno. Note que estou declarando o manipulador para o evento Click do botão. Neste manipulador, adiciono o TabItem. Note que estou adicionando um monte de componentes dentro deste TabItem. O ideal seria criar um User Control e adicionar só ele no TabItem:

     

    Code Snippet

    void btn_Click(object sender, RoutedEventArgs e)

    {

      TabItem item2 = new TabItem();

      numItem++;

      item2.Header = string.Format("Item {0}", numItem);

    // aqui adiciono o tabitem no TabControl (tab2)

      tab2.Items.Add(item2);

      StackPanel stack2 = new StackPanel();

      stack2.Children.Add(new TextBox());

      stack2.Children.Add(new TextBox());

      item2.Content = stack2;

      StackPanel stack3 = new StackPanel();

      stack3.Orientation = Orientation.Horizontal;

      TextBlock text = new TextBlock();

      text.Text = item2.Header.ToString();

      text.Margin = new Thickness(5);

      stack3.Children.Add(text);

      text = new TextBlock();

      text.Text = "Texto no SP Horizontal";

      text.Margin = new Thickness(5);

      stack3.Children.Add(text);

      stack2.Children.Add(stack3);

    }

     

     

    Bruno

    quarta-feira, 12 de novembro de 2008 15:53
  •  

    Valeu Bruno consegui resolver aqui com sua ajuda.

     

    Agora só me resta criar um rotina que entre em todas as tabs verifique os campos e salve no banco de acordo com que foi preenchido nesses tabitems....

     

    Vi aquela sugestão sua para, criar os objetos no construtor para facilitar na hora de pegar o conteudo desses objetos para salvar, mas no meu caso acho que vou ter que fazer os casts mesmo...pois não tem como eu saber que tab eu estou...

     

     

    Vou ter que fazer um for nas Tabs onde que o index vai ser o i.

     

    por exemplo:

     

    for(int i = 0;i < tabControl.Items.Count; i++)

    {

    ((TextBox)((Cast)((Cast).Items[i]).Children[1]).Text = nomeContato.Nome;

    }

     

    Do jeito que você falou já não vou ter como fazer isso, pois não vou ter como percorrer os indices dessa forma...

     

    text.text = nomeContato.Nome;

     

     

    Obrigado !!

    quarta-feira, 12 de novembro de 2008 18:02
  • Agora como criaria tabs a partir do SelectedItem da TabItemPrincipal?

    Porque este exemplo ele só cria na última TabItemPrincipal criada.

     

     

     

    Obrigado!

    quarta-feira, 12 de novembro de 2008 18:15
  • Ah um resolvi aqui....

     

    Consegui criar a partir de um cast que fiz...

     

    ((TabControl)((Grid)((TabItem)tabEnderecoContato.Items[tabEnderecoContato.SelectedIndex]).Content).Children[1]).Items.Add(tb2);

     

    Ai consegui pegar o selectedindex e adicionar a partir dele...

     

    Só sobrou o outro problema agora...

    Vlw

    quarta-feira, 12 de novembro de 2008 19:02
  • Você pode fazer algo assim:

     

    Code Snippet

    TabItem tabSelecionado = tab1.SelectedItem;

    TabItem tabSelecionado = (TabItem)tab1.SelectedItem;

    StackPanel stackSelecionado = (StackPanel)tabSelecionado.Content;

    TabControl subTab = null;

    foreach (var filho in stackSelecionado.Children)

    {

      if (filho is TabControl)

      {

        subTab = (TabControl)filho;

        break;

      }

    }

     

    if (subTab != null)

    {

    // Aqui você adiciona os controles em SubTab

       

     

     

    Bruno

    quarta-feira, 12 de novembro de 2008 19:02