0

2 つのテキスト ボックスで始まるダイナミック テキスト ボックスを生成しようとしています。

値が最初のテキスト ボックスの値より小さい場合は、別のテキスト ボックスを動的に生成し、ユーザーがさらに値を入力できるようにします。
これは、生成された 2 番目から最後のテキスト ボックスまでのすべてのテキスト ボックスの値の合計が最初のテキスト ボックスの値と等しくなるまで実行する必要があります。

もちろん、テキストボックスやラベルなどを使用して他のものを生成し、正しく配置する必要があるため、グリッドを使用してグリッドを動的に生成することを考えましたが、その上で迷子になりました。

ヘルプはありますか?

ありがとう


次のコードでスクロールビューアを使用しました

<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>

その上に別のテキストボックスがありますが、スクロールビューアはありません。スクロールビューアに表示されるグリッドのインスタンスを必要なだけ動的に作成して、それらを等しくすることを考えていました。

同じグリッドの新しいインスタンスを作成し、それらをコードで動的に scollviewer に追加することは可能ですか?

ありがとう

4

2 に答える 2

1

提供した追加情報を見て、作成したいオブジェクトの複雑さを考えると、UserControlがおそらく最適です。このコードはDoubleClick、UserControlをScrollViewerに追加する方法を示すためにを使用した例です。TextBoxから情報を取得するには、のプロパティを公開する必要がありUserControlます。そうしないと、コードは以前の回答と同じになるはずです。

すなわち:

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>

ウィンドウ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>

メインウィンドウコード

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);
    }

}

これが基本的な考え方です。私はをStackPanel保持するTextBox'sために使用しDockPanelています。ラベルなどを保持するためにを使用して、それをに追加することもできますStackPanel

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>

コード

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();
        }
    }
}
于 2012-04-08T01:57:04.207 に答える
0

コレクションをアイテムに渡します。次に、セットで、必要に応じてコレクションに追加します。

 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 ...
于 2012-04-08T23:05:19.057 に答える