2012-04-07 16 views
0

Ich versuche dynamisches Textfeld zu generieren Beginnen mit zwei Textfeldern.Dynamisch Textbox generieren, um Summe zu entsprechen

, wenn der Wert kleiner als der Wert in dem ersten Textfeld dann dynamisch eine andere Textbox erzeugen und lassen den Anwender mehr Werte eingeben.
Dies muss getan werden, bis die Summe der Werte aller Textfelder vom zweiten bis zum letzten generierten Text gleich dem Wert des ersten Textfelds ist.

Natürlich können auch andere Dinge müssen mit den Textfeldern erzeugt werden und wie Lables usw. und richtig positioniert, so dachte ich, ein Raster der Verwendung und das Gitter dynamisch generieren, aber vor, dass ich bin verloren.

Hilfe?

Dank


i ein Scroll mit dem folgenden Code verwenden

<ScrollViewer Margin="8,8,8,14.417" Grid.Row="4" Grid.ColumnSpan="5" VerticalScrollBarVisibility="Hidden"> 
    <Grid Margin="8" Grid.Row="4" Grid.ColumnSpan="4" x:Name="amtGrid"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="Auto" MinWidth="103"/> 
      <ColumnDefinition Width="Auto" MinWidth="324"/> 
      <ColumnDefinition Width="Auto" MinWidth="218"/> 
      <ColumnDefinition/> 
     </Grid.ColumnDefinitions> 
     <ComboBox x:Name="crdrnextrows" Margin="32.367,8,8,7.423" SelectedIndex="1" /> 
     <ComboBox Background="#FFC6C3C6" Margin="8" x:Name="comboboxCr" GotKeyboardFocus="comboboxCr_GotKeyboardFocus" Grid.Column="1"/> 
     <TextBox Background="#FFC6C3C6" Foreground="White" IsEnabled="True" Margin="7.973,8,8,8" x:Name="txtBoxam1" Grid.Column="2" LostFocus="txtBoxam1_LostFocus"/> 
     <TextBox Background="#FFC6C3C6" Foreground="White" IsEnabled="True" Margin="8,8,33.972,8" x:Name="txtBoxamt2" Grid.Column="3" LostFocus="textBox4_LostFocus"/> 
    </Grid> 
</ScrollViewer> 

Es gibt ein anderes Textfeld oben, dass mit ähnlichem Code ist aber ohne den Scroll-Betrachter, was jetzt war ich dachte dynamisch Erstellen Sie Instanzen des im Scrollviewer angezeigten Rasters so oft wie nötig, um sie gleich zu machen.

Ist es möglich, neue Instanzen desselben Rasters zu erstellen und diese dynamisch mit Code dem scollviewer hinzuzufügen?

Dank

+0

Dude müssen spezifischer als "der Wert weniger als der Wert in der ersten". – Paparazzi

+0

Ich meine, dass z. Wenn ich 10000 in das erste Textfeld und in das zweite Textfeld eingib, gebe ich 5000 ein, dann sollte ein anderes Textfeld erzeugt werden, um die verbleibenden 5000 einzugeben und wenn der eingegebene Betrag in dem neuen Textfeld zu den vorherigen Werten addiert wird, addiert sich nicht zu 10000 ein anderes Textfeld sollte generiert werden. Dies geht weiter, bis die addierten Werte aller Textfelder gleich 10000 werden. Hoffe, dass die Dinge klar werden. – Shaumux

Antwort

1

auf die zusätzlichen Informationen zu suchen, dass Sie gab und die Komplexität des Objekts, das Sie erstellen wollen, sind gegeben, wäre ein UserControl wahrscheinlich die beste Lösung sein. Dieser Code ist ein Beispiel, das anhand einer DoubleClick zeigt, wie Sie das UserControl zu Ihrem ScrollViewer hinzufügen. Sie müssen Eigenschaften in der UserControl verfügbar machen, um die Informationen von Ihren TextBoxen zu erhalten, andernfalls sollte der Code meiner früheren Antwort ähnlich sein.

heißt:

Usercontrol XAML

<UserControl x:Class="WpfApplication1.UserControl1" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="70" d:DesignWidth="985"> 
    <Grid Margin="8" Grid.Row="4" Grid.ColumnSpan="4" x:Name="amtGrid" Height="40"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="Auto" MinWidth="103"/> 
      <ColumnDefinition Width="Auto" MinWidth="324"/> 
      <ColumnDefinition Width="Auto" MinWidth="218"/> 
      <ColumnDefinition/> 
     </Grid.ColumnDefinitions> 
     <ComboBox x:Name="crdrnextrows" Margin="32.367,8,8,7.423" SelectedIndex="1" /> 
     <ComboBox Background="#FFC6C3C6" Margin="8" x:Name="comboboxCr" GotKeyboardFocus="comboboxCr_GotKeyboardFocus" Grid.Column="1"/> 
     <TextBox Background="#FFC6C3C6" Foreground="White" IsEnabled="True" Margin="7.973,8,8,8" x:Name="txtBoxam1" Grid.Column="2" LostFocus="txtBoxam1_LostFocus"/> 
     <TextBox Background="#FFC6C3C6" Foreground="White" IsEnabled="True" Margin="8,8,33.972,8" x:Name="txtBoxamt2" Grid.Column="3" LostFocus="txtBoxamt2_LostFocus"/> 
    </Grid> 
</UserControl> 

Fenster Xaml

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="123" Width="1098" xmlns:my="clr-namespace:WpfApplication1" MouseDoubleClick="Window_MouseDoubleClick"> 

    <ScrollViewer VerticalScrollBarVisibility="Auto"> 
     <StackPanel Name="stackPanel1" VerticalAlignment="top" HorizontalAlignment="Left" > 
      <my:UserControl1 x:Name="userControl11" Width="1077" /> 
     </StackPanel> 
    </ScrollViewer> 

</Window> 

Hauptfenster-Code

public partial class MainWindow : Window 
{ 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void Window_MouseDoubleClick(object sender, MouseButtonEventArgs e) 
    { 
     UserControl1 newUserControl = new UserControl1(); 
     newUserControl.Width = userControl11.Width; 
     newUserControl.Height = userControl11.Height; 
     stackPanel1.Children.Add(newUserControl); 
    } 

} 

Hier ist eine einfache Idee, ich bin ein StackPanel mit der TextBox's möchten Sie vielleicht halten eine DockPanel benutzen, um Ihre Etiketten und etc zu halten und dass zum StackPanel hinzuzufügen.

XAML

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <StackPanel Name="myContainer"> 
      <TextBox Height="23" HorizontalAlignment="Left" Margin="10,10,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" KeyDown="textBox1_KeyDown" /> 
      <TextBox Height="23" HorizontalAlignment="Left" Margin="10,10,0,0" Name="textBox2" VerticalAlignment="Top" Width="120" KeyDown="textBox2_KeyDown"/> 
     </StackPanel> 
    </Grid> 
</Window> 

-Code

public partial class MainWindow : Window 
{ 
    Collection<Control> myControls = new Collection<Control>(); 

    public MainWindow() 
    { 
     InitializeComponent(); 
     myControls.Add(textBox2); 
    } 


    private void textBox2_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.Key == Key.Enter) 
     { 
      int temp; 
      int sum; 
      sum = 0; 
      foreach (TextBox tb in myControls) 
      { 
       if (int.TryParse(tb.Text, out temp)) 
       { 
        sum += temp; 
       } 
      } 
      int test = 0; 
      if (int.TryParse(textBox1.Text, out test)) 
      { 
       if (sum < test) 
       { 
        TextBox newtb = new TextBox(); 
        newtb.Width = ((TextBox)sender).Width; 
        newtb.Height = ((TextBox)sender).Height; 
        newtb.Margin = new Thickness(((TextBox)sender).Margin.Left, ((TextBox)sender).Margin.Top , ((TextBox)sender).Margin.Right , ((TextBox)sender).Margin.Bottom); 
        newtb.HorizontalAlignment = ((TextBox)sender).HorizontalAlignment; 
        newtb.KeyDown += new KeyEventHandler(textBox2_KeyDown); 
        myContainer.Children.Add(newtb); 
        myControls.Add(newtb); 
        newtb.Focus(); 
       } 
       else 
        this.Background = Brushes.LightBlue; 
      } 
     } 
    } 

    private void textBox1_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.Key == Key.Enter) 
     { 
      textBox2.Focus(); 
     } 
    } 
} 
0

Übergeben Sie die Sammlung auf den Punkt. Dann fügen Sie im Set der Sammlung bei Bedarf hinzu.

public class dynamicInts 
{ 
    private int dInt; 
    private ObservableCollection<DynamicInt> dynamicInts 

    public int DInt 
    { 
     get { return dInt; } 
     set 
     { 
      value = dInt; 
      int sumInt; 
      foreach (DynamicInt di in dynamicInts) sumInt += di.Dint) 
      if (sumInt < 2*dynamicInts) dynamicInts.add(newdynamicInts ...