Usuário com melhor resposta
Inserir TabItem em um TabControl dentro de outro TabControl em Run-time....

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!
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
-
Veja este código:
Code SnippetTabControl
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 Snippetvoid
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
-
Você pode fazer algo assim:
Code SnippetTabItem 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
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
-
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..
-
Veja este código:
Code SnippetTabControl
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 Snippetvoid
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
-
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 !!
-
-
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
-
Você pode fazer algo assim:
Code SnippetTabItem 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