C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: xamlのコントロールの動的な作成について


(過去ログ 148 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■86635 / inTopicNo.1)  xamlのコントロールの動的な作成について
  
□投稿者/ poke (1回)-(2018/02/24(Sat) 03:54:25)

分類:[.NET 全般] 


分類:[.NET 全般] 

お世話になっております。
C#とxamlを勉強してる者なのですが
C#WPFについての質問です。

下記の動作を行いたいのですが、
例外「型 'System.InvalidOperationException' のハンドルされていない例外が PresentationFramework.dll で発生しました
   指定された要素は、既に別の要素の論理子です。まず接続を切断してください」。

が発生しうまくいきません。
ネットなどを調べてみたのですが原因が分からずとなっている状況です。
どうかご指導とご鞭撻のほどよろしくお願いいたします。


・行いたい動作
1:TextBox1に値を入力し登録ボタンを押下
2:TextBox1の値をTextBox2に入れる
3:1を行うたびにTextBox2が動的に作成される(下に追加されていく)

TextBox1とTextBox2は下記になります。
※x:Name="textvalue" → TextBox1
x:Name="textinsertvalue" → TextBox2

以下、コードとなります。
※削除ボタンと編集ボタンはまだ処理を記載していません。


・xaml
<Window x:Class="WpfApp1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp1"
mc:Ignorable="d"
Title="登録画面" Height="500.914" Width="743.033">
<Window.Resources>
<!-- Textbox2スタイル -->
<Style x:Key="TextBox2Style" TargetType="{x:Type TextBox}">
<Setter Property="FontSize" Value="12"/>
<Setter Property="Width" Value="200"/>
<Setter Property="Margin" Value="10,190,0,0" />
<Setter Property="Height" Value="30"/>
</Style>
<!-- Textbox1スタイル -->
<Style x:Key="TextBox1Style" TargetType="{x:Type TextBox}"
BasedOn="{StaticResource TextBox2Style}">
<Setter Property="Height" Value="20"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="Margin" Value="10,100,0,0" />
<Setter Property="Width" Value="200"/>
</Style>
<!-- Buttonスタイル -->
<Style x:Key="Default1Button" TargetType="{x:Type Button}">
<Setter Property="FontSize" Value="17"/>
<Setter Property="Content" Value="登録"/>
<Setter Property="Margin" Value="1,-140,200,100"/>
<Setter Property="Height" Value="50"/>
<Setter Property="Width" Value="70"/>
</Style>
<!-- Buttonスタイル -->
<Style x:Key="Default2Button" TargetType="{x:Type Button}"
BasedOn="{StaticResource Default1Button}">
<Setter Property="Content" Value="削除"/>
<Setter Property="Margin" Value="210,-150,210,100"/>
</Style>
<!-- Buttonスタイル -->
<Style x:Key="Default3Button" TargetType="{x:Type Button}"
BasedOn="{StaticResource Default1Button}">
<Setter Property="Content" Value="編集"/>
<Setter Property="Margin" Value="390,-170,200,80"/>
</Style>
</Window.Resources>

<Grid x:Name="grid1">
<StackPanel>
<TextBox x:Name="textvalue" Style="{StaticResource TextBox1Style}" ></TextBox>
<TextBox x:Name="textinsertvalue" Style="{StaticResource TextBox2Style}" ></TextBox>
<Button Style="{StaticResource Default1Button}" Click="Button_Click"></Button>
<Button Style="{StaticResource Default2Button}" Click="Button_Click_1"></Button>
<Button Style="{StaticResource Default3Button}" Click="Button_Click_2"></Button>
</StackPanel>
</Grid>
</Window>

・xaml.cs
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}

private void Button_Click(object sender, RoutedEventArgs e)
{
var value = textvalue.Text;

if (value == null)
{
MessageBox.Show("登録内容を入力してからボタンを押下してください。");
}
else
{
//テキスト内容をxmlに出力するメソッド呼出
Class2 class2 = new Class2();
class2.Xmlwrite(value);

//TextBox1の内容をTextBox2にコピー
textinsertvalue.Text = value;

//動的にTextBoxを作成
        //★ここで上記記載の例外発生★
grid1.Children.Add(textinsertvalue);

//MessageBox.Show("登録が完了しました。");
}
}
引用返信 編集キー/
■86640 / inTopicNo.2)  Re[1]: xamlのコントロールの動的な作成について
□投稿者/ Hongliang (616回)-(2018/02/24(Sat) 16:42:54)
2018/02/24(Sat) 16:43:38 編集(投稿者)

> //TextBox1の内容をTextBox2にコピー
> textinsertvalue.Text = value;
>
> //動的にTextBoxを作成
> //★ここで上記記載の例外発生★
> grid1.Children.Add(textinsertvalue);

Addメソッドは作成処理を含みません。作成済みのインスタンスをコレクションに追加するだけです。
なので、新しいTextBoxを追加したいのであれば、自分でnewするなりする必要があります。
Textの他にStyleも設定する必要がありそうですが、StyleはWindow.Resourcesに定義されているようなので、MainWindow内なら
(Style)this.FindResource("TextBox2Style")
とすることで取得できます。

多少慣れてきたら、MVVMパターンでコーディングしていくことをお薦めします。
なにせ世のWPFの解説サイトはおおよそがMVVMパターンを前提としているので。
引用返信 編集キー/
■86651 / inTopicNo.3)  Re[2]: xamlのコントロールの動的な作成について
□投稿者/ ぶなっぷ (168回)-(2018/02/26(Mon) 09:24:52)
あともう一つ。

> grid1.Children.Add(textinsertvalue);
だと、下には追加されません。
Gridは、Grid.Row や Grid.Column を指定しない場合、
重なって表示されるからです。

Grid.Row や Grid.Column を指定するのも面倒なので、
StackPanelを使うと簡単にできます。

<StackPanel>
    <StackPanel x:Name="stackPanel">
        <TextBox x:Name="textvalue" Style="{StaticResource TextBox1Style}" >
        </TextBox>
        <TextBox x:Name="textinsertvalue" Style="{StaticResource TextBox2Style}" >
        </TextBox>
    </StackPanel>
    <Button Style="{StaticResource Default1Button}" Click="Button_Click">
    </Button>
    <Button Style="{StaticResource Default2Button}" Click="Button_Click_1">
    </Button>
    <Button Style="{StaticResource Default3Button}" Click="Button_Click_2">
    </Button>
</StackPanel>
としておいて、

stackPanel.Children.Add(〜);
ですね。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -