質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

解決済

WPFで、行ボタン押したら上の行と同じ内容を挿入したい、親と子の色情報を共有したい

nya-3
nya-3

総合スコア25

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

1回答

0評価

1クリップ

469閲覧

投稿2022/03/14 02:12

WPFで、行にボタンを追加し、上の行と同じ内容を挿入したい(行番号を取得したい)

WPF「ObservableCollection」「INotifyCollectionChanged」「Class」が良く分からない
https://teratail.com/questions/1ypxtzrjzwnam0

上記リンクと似たような事がしたかったのですが、
良く分からないため質問させてください。ソースもお借りしました。

前提・実現したいこと

●ボタン列をクリックしたときに、行番号を取得したい
・「追加」列のボタンを押したら、1行上の行をコピーし挿入したい
「画像ファイル」「タイトル」「詳細」を結合させたい(できたらレベルの話なので、出来なくても問題ない)

 ・「削除」列のボタンを押したら、警告を出した後 行を削除したい

●別のxamlで色を選択したいが、子ウィンドウへと親ウィンドウの文字色受け渡しが分からない
・そもそも「Button」にする必要はあったのか…(Webで使える色名を選択できるようにしたかった)
DataGridへのCombobox選択も良いかと思ったのですが、操作性が良くなさそうなのと
WPF初心者な自分には難しそうだったので、別ウィンドウで表示して選択させるようにしようと思いました。
ですが、親フォームにある色を子フォームに持っていく方法・子から親に持っていく方法が分かりません。

該当のソースコード

xaml

<Window x:Class="nya_3.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:nya_3" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> <Grid> <Grid.RowDefinitions> <RowDefinition /> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding}"> <DataGrid.Columns> <DataGridTextColumn Binding="{Binding Mypic}" Header="画像ファイル" /> <DataGridTextColumn Binding="{Binding Title}" Header="タイトル" /> <DataGridTextColumn Binding="{Binding Detail}" Header="詳細" /> <DataGridTemplateColumn Header="色"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Button Content="White" Click="Color_Click" Background="White"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTextColumn Header="次リンク" Binding="{Binding Nextlink}" /> <DataGridTemplateColumn Header="追加"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Button Content="+" Click="Add_Click" Tag="{Binding}" Background="White" /> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTemplateColumn Header="削除"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Button Content="-" Click="Del_Click" Tag="{Binding}" Background="White"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid> <UniformGrid Grid.Row="1" HorizontalAlignment="Center" Rows="1"> <Button Margin="10" Click="SaveButton_Click" Content="Save" /> <Button Margin="10" Click="LoadButton_Click" Content="Load" /> <Button Margin="10" Click="AddButton_Click" Content="Add" /> </UniformGrid> </Grid> </Window>

C#

using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Xml.Serialization; namespace nya_3 { /// <summary> /// MainWindow.xaml の相互作用ロジック /// </summary> public partial class MainWindow : Window { public class Item { [XmlAttribute] public string Mypic { get; set; } [XmlAttribute] public string Title { get; set; } [XmlAttribute] public string Detail { get; set; } [XmlAttribute] public string Nextlink { get; set; } [XmlAttribute] public bool Isedit { get; set; } } public ObservableCollection<Item> Items { get; private set; } = new ObservableCollection<Item>(); public MainWindow() { InitializeComponent(); Items.Add(new Item { Mypic = "1.jpeg", Title = "タイトル1", Detail = "詳細1", Nextlink="2.jpeg", }); Items.Add(new Item { Mypic = "2.jpeg", Title = "タイトル2", Detail = "詳細2", Nextlink = "1.jpeg" ,}); Items.Add(new Item { Mypic = "3.jpeg", Title = "タイトル3", Detail = "詳細3", Nextlink = "3.jpeg", }); DataContext = Items; } private void SaveButton_Click(object sender, RoutedEventArgs e) { var serializer = new XmlSerializer(Items.GetType()); using (var fs = new FileStream("mydata.xml", FileMode.Create)) serializer.Serialize(fs, Items); } private void LoadButton_Click(object sender, RoutedEventArgs e) { var serializer = new XmlSerializer(Items.GetType()); using (var fs = new FileStream("mydata.xml", FileMode.Open)) { Items = (ObservableCollection<Item>)serializer.Deserialize(fs); // Items自体の変更は通知されないので明示的に入れ替え // INotifyPropertyChangedを実装するか、Clear・Addするか DataContext = null; DataContext = Items; } } private void AddButton_Click(object sender, RoutedEventArgs e) { Items.Add(new Item {Isedit = true, }); } private void Add_Click(object sender, RoutedEventArgs e) { Console.WriteLine((((Button)sender).Tag as Item).Title); //クリックした行と部分的に同じものを、1つ下の行に挿入したい Items.Insert(1, new Item { Title = $"タイトル{1}", Detail = $"詳細{1}", }); //やり方が分からなかったため、とりあえず1行目の下にInsert } private void Del_Click(object sender, RoutedEventArgs e) { //クリックした行を削除したい Console.WriteLine((((Button)sender).Tag as Item).Title); //やり方は不明 } } }

子ウィンドウ

xaml

<Window x:Class="nya_3.ColorSelectWin" 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:nya_3" mc:Ignorable="d" Title="ColorSelectWin" Height="180" Width="300"> <Grid> <StackPanel Orientation="Vertical"> <StackPanel Orientation="Horizontal" Height="30"> <Button Content="1" Width="30" Background="black"></Button> <Button Content="1" Width="30" Background="darkslategray"></Button> <Button Content="1" Width="30" Background="slategray"></Button> <Button Content="1" Width="30" Background="lightslategray"></Button> <Button Content="1" Width="30" Background="dimgray"></Button> <Button Content="1" Width="30" Background="gray"></Button> <Button Content="1" Width="30" Background="darkgray"></Button> <Button Content="1" Width="30" Background="silver"></Button> <Button Content="1" Width="30" Background="lightgray"></Button> <Button Content="1" Width="30" Background="gainsboro"></Button> </StackPanel> <StackPanel Orientation="Horizontal" Height="30"> <Button Content="1" Width="30" Background="white"></Button> <Button Content="1" Width="30" Background="mintcream"></Button> <Button Content="1" Width="30" Background="azure"></Button> <Button Content="1" Width="30" Background="aliceblue"></Button> <Button Content="1" Width="30" Background="ghostwhite"></Button> <Button Content="1" Width="30" Background="whitesmoke"></Button> <Button Content="1" Width="30" Background="seashell"></Button> <Button Content="1" Width="30" Background="beige"></Button> <Button Content="1" Width="30" Background="lavenderblush"></Button> <Button Content="1" Width="30" Background="mistyrose"></Button> </StackPanel> <StackPanel Orientation="Horizontal" Height="30"> <Button Content="1" Width="30" Background="orangered"></Button> <Button Content="1" Width="30" Background="darkorange"></Button> <Button Content="1" Width="30" Background="red"></Button> <Button Content="1" Width="30" Background="tomato"></Button> <Button Content="1" Width="30" Background="coral"></Button> <Button Content="1" Width="30" Background="gold"></Button> <Button Content="1" Width="30" Background="yellow"></Button> <Button Content="1" Width="30" Background="lightyellow"></Button> <Button Content="1" Width="30" Background="violet"></Button> <Button Content="1" Width="30" Background="pink"></Button> </StackPanel> </StackPanel> </Grid> </Window>

※文字数のため、SlackPanelを2行分削除

試したこと

調べると「e.RowIndex」というので取得できそうだと思ったのですが、
e.と入力した後の候補に出てこないため利用できないと判断しました。
DataTableを利用していたら可能なもの?なのかもしれません。
ググッても見つかりませんでした…。

補足情報(FW/ツールのバージョンなど)

.Net FrameWork 4.7.2

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです