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

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

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

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

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

WPF

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

解決済

削除時の確認ダイアログを実装したい

tranokado
tranokado

総合スコア4

C#

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

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

WPF

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

1回答

0グッド

1クリップ

551閲覧

投稿2022/04/29 01:27

編集2022/04/29 02:04

前提・実現したいこと

お世話になっております。

WPFアプリケーション作成にあたり、削除ボタンを実装しているのですが
削除ボタン押下時に確認ダイアログを表示させたいと思っております。

試したこと

MessageBox.Showを用いて削除コマンドのif文内に、もう一つの指定を行おうとしました。
その際、新たなusingを指定すると以前までのコードでcs0104の

プログラムには2つの名前空間のusingディレクティブが含まれており、コードは両方の名前空間に表示される名前を参照しています。

が起きてしまいきれいな形でエラー解消を実現することができませんでした。
(それぞれどのusingを使用するか指定すればエラー解決は可能)

お聞きしたいこと

  • 削除確認ダイアログの実装方針
  • 大きなプログラムを書く際に、以前までのコードでかみ合わないエラーが発生する場合どのように対処するのがよいのか。(過去のコードを修正するorうまくいく形を模索する)

該当のソースコード

xaml

1<Window 2 x:Class="Qogxgft0o3rrwcj.MainWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 xmlns:dd="urn:gong-wpf-dragdrop" 6 xmlns:local="clr-namespace:Qogxgft0o3rrwcj" 7 Width="800" 8 Height="450"> 9 <Window.Resources> 10 <local:ManagerDropHandler x:Key="ManagerDropHandler" /> 11 <Style TargetType="Button"> 12 <Setter Property="Margin" Value="10,5" /> 13 <Setter Property="MinWidth" Value="80" /> 14 </Style> 15 <Style TargetType="GroupBox"> 16 <Setter Property="BorderThickness" Value="0" /> 17 </Style> 18 </Window.Resources> 19 20 <Grid Margin="10"> 21 <Grid.ColumnDefinitions> 22 <ColumnDefinition Width="10*" /> 23 <ColumnDefinition Width="27*" /> 24 </Grid.ColumnDefinitions> 25 26 <DockPanel> 27 <Button 28 Click="OpenButton_Click" 29 Content="開く" 30 DockPanel.Dock="Top" /> 31 <Button 32 Click="SaveAsButton_Click" 33 Content="保存" 34 DockPanel.Dock="Top" /> 35 36 <GroupBox Header="name"> 37 <ListBox 38 x:Name="nameListBox" 39 dd:DragDrop.DropHandler="{StaticResource ManagerDropHandler}" 40 dd:DragDrop.IsDragSource="True" 41 dd:DragDrop.IsDropTarget="True" 42 DisplayMemberPath="name" 43 IsSynchronizedWithCurrentItem="True" 44 ItemsSource="{Binding}" /> 45 </GroupBox> 46 </DockPanel> 47 48 <Grid Grid.Column="1"> 49 <Grid.RowDefinitions> 50 <RowDefinition Height="Auto" /> 51 <RowDefinition /> 52 <RowDefinition Height="Auto" /> 53 </Grid.RowDefinitions> 54 55 <DockPanel> 56 <StackPanel DockPanel.Dock="Right"> 57 <Button Click="Name_NewButton_Click" Content="新規" /> 58 <Button Click="Name_DelButton_Click" Content="削除" /> 59 </StackPanel> 60 <StackPanel> 61 <GroupBox DockPanel.Dock="Top" Header="name"> 62 <TextBox Text="{Binding /name, UpdateSourceTrigger=PropertyChanged}" /> 63 </GroupBox> 64 <GroupBox DockPanel.Dock="Top" Header="URL"> 65 <TextBox Text="{Binding /url, UpdateSourceTrigger=PropertyChanged}" /> 66 </GroupBox> 67 </StackPanel> 68 </DockPanel> 69 70 <GroupBox Grid.Row="1" Header="subname"> 71 <ListBox 72 x:Name="subNameListBox" 73 dd:DragDrop.IsDragSource="True" 74 dd:DragDrop.IsDropTarget="True" 75 DisplayMemberPath="subname" 76 IsSynchronizedWithCurrentItem="True" 77 ItemsSource="{Binding /manager_list}" /> 78 </GroupBox> 79 80 <DockPanel Grid.Row="2"> 81 <StackPanel DockPanel.Dock="Right"> 82 <Button Click="SubName_NewButton_Click" Content="新規" /> 83 <Button Click="SubName_DelButton_Click" Content="削除" /> 84 </StackPanel> 85 86 <StackPanel> 87 <GroupBox Header="subname"> 88 <TextBox Text="{Binding /manager_list/subname, UpdateSourceTrigger=PropertyChanged}" /> 89 </GroupBox> 90 <GroupBox Header="address"> 91 <TextBox Text="{Binding /manager_list/address, UpdateSourceTrigger=PropertyChanged}" /> 92 </GroupBox> 93 </StackPanel> 94 </DockPanel> 95 </Grid> 96 </Grid> 97</Window>

C#

1using System.Collections.ObjectModel; 2using System.IO; 3using System.Windows; 4using GongSolutions.Wpf.DragDrop; 5using GongSolutions.Wpf.DragDrop.Utilities; 6using Microsoft.Win32; 7using Newtonsoft.Json; 8using System.Windows.Forms; 9 10namespace Qogxgft0o3rrwcj 11{ 12 public class Manager 13 { 14 public string subname { get; set; } 15 public string address { get; set; } 16 } 17 18 public class PersonalData 19 { 20 public string name { get; set; } 21 public string url { get; set; } 22 public ObservableCollection<Manager> manager_list { get; set; } 23 } 24 25 public partial class MainWindow : Window 26 { 27 private ObservableCollection<PersonalData> _data = new ObservableCollection<PersonalData>(); 28 29 public MainWindow() 30 { 31 InitializeComponent(); 32 DataContext = _data; 33 34 Dummy(); 35 } 36 37 private void OpenButton_Click(object sender, RoutedEventArgs e) 38 { 39 var dialog = new OpenFileDialog { Filter = "json|*.json", }; 40 if (dialog.ShowDialog() == true) 41 { 42 var json = File.ReadAllText(dialog.FileName); 43 _data = JsonConvert.DeserializeObject<ObservableCollection<PersonalData>>(json); 44 DataContext = _data; 45 } 46 } 47 private void SaveAsButton_Click(object sender, RoutedEventArgs e) 48 { 49 var dialog = new SaveFileDialog { Filter = "json|*.json", }; 50 if (dialog.ShowDialog() == true) 51 { 52 var json = JsonConvert.SerializeObject(_data, Formatting.Indented); 53 File.WriteAllText(dialog.FileName, json); 54 } 55 } 56 57 private void Name_NewButton_Click(object sender, RoutedEventArgs e) 58 { 59 var data = new PersonalData 60 { 61 name = "new name", 62 manager_list = new ObservableCollection<Manager>(), 63 }; 64 _data.Add(data); 65 nameListBox.SelectedItem = data; 66 } 67 private void Name_DelButton_Click(object sender, RoutedEventArgs e) 68 { 69 DialogResult result = MessageBox.Show("msg", "タイトル", MessageBoxButtons.YesNo); 70 if (nameListBox.SelectedItem is PersonalData data) 71 { 72 _data.Remove(data); 73 } 74 } 75 76 private void SubName_NewButton_Click(object sender, RoutedEventArgs e) 77 { 78 if (nameListBox.SelectedItem is PersonalData data) 79 { 80 var manager = new Manager { subname = "new subname", }; 81 data.manager_list.Add(manager); 82 subNameListBox.SelectedItem = manager; 83 } 84 } 85 private void SubName_DelButton_Click(object sender, RoutedEventArgs e) 86 { 87 if (nameListBox.SelectedItem is PersonalData data 88 && subNameListBox.SelectedItem is Manager manager) 89 { 90 data.manager_list.Remove(manager); 91 } 92 } 93 94 95 private void Dummy() 96 { 97 if (File.Exists("test.json")) return; 98 99 var json = @" 100[ 101 { 102 ""name"": ""tora"", 103 ""url"": ""https:tora.com"", 104 ""manager_list"": [ 105 { 106 ""subname"": ""tiger"", 107 ""address"": ""chiba"" 108 }, 109 { 110 ""subname"": ""tiger2"", 111 ""address"": ""tokyo"" 112 } 113 ] 114 }, 115 { 116 ""name"": ""cat"", 117 ""url"": ""https:cat.com"", 118 ""manager_list"": [ 119 { 120 ""subname"": ""neko"", 121 ""address"": ""kanagawa"" 122 }, 123 { 124 ""subname"": ""neko2"", 125 ""address"": ""yokohama"" 126 } 127 ] 128 } 129] 130".Trim(); 131 132 File.WriteAllText("test.json", json); 133 } 134 } 135 136 137 class ManagerDropHandler : DefaultDropHandler 138 { 139 public override void DragOver(IDropInfo dropInfo) 140 { 141 // nameListBox内アイテム並び替え(デフォルト動作) 142 if (dropInfo.Data is PersonalData && dropInfo.TargetItem is PersonalData) 143 { 144 base.DragOver(dropInfo); 145 } 146 // subNameListBox→nameListBox アイテム移動・コピー(Ctrl+ドラッグ) 147 else if (dropInfo.Data is Manager && dropInfo.TargetItem is PersonalData) 148 { 149 var isCopy = dropInfo.KeyStates.HasFlag(DragDropKeyStates.ControlKey); 150 dropInfo.Effects = isCopy ? DragDropEffects.Copy : DragDropEffects.Move; 151 dropInfo.DropTargetAdorner = DropTargetAdorners.Highlight; 152 } 153 } 154 155 public override void Drop(IDropInfo dropInfo) 156 { 157 if (dropInfo?.DragInfo == null) return; 158 159 // nameListBox内アイテム並び替え(デフォルト動作) 160 if (dropInfo.Data is PersonalData && dropInfo.TargetItem is PersonalData) 161 { 162 base.Drop(dropInfo); 163 } 164 // subNameListBox→nameListBox アイテム移動・コピー(Ctrl+ドラッグ) 165 else if (dropInfo.Data is Manager source && dropInfo.TargetItem is PersonalData target) 166 { 167 var sourceList = dropInfo.DragInfo.SourceCollection.TryGetList(); 168 if (dropInfo.Effects == DragDropEffects.Copy) 169 { 170 var copy = new Manager { subname = source.subname, address = source.address, }; 171 target.manager_list.Add(copy); 172 } 173 else if (dropInfo.Effects == DragDropEffects.Move) 174 { 175 sourceList.Remove(source); 176 target.manager_list.Add(source); 177 } 178 } 179 } 180 } 181}

以下のような質問にはグッドを送りましょう

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

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

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

TN8001

2022/04/29 01:55

> その際、新たなusingを指定すると以前までのコードでcs0104の そのエラーになっている状態を提示していただきたいのですが、 using System.Windows.Forms; があるってことですか? WPF用 [MessageBox クラス (System.Windows) | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.messagebox) WinForms用 [MessageBox クラス (System.Windows.Forms) | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.messagebox)
tranokado

2022/04/29 02:07

わかりにくい表記になっていてすみません。 先ほど、ソースコードの方を修正させていただきました。 >using System.Windows.Forms;があるってことですか? そうです。そちらが過去コードと干渉してしまっている状況ですね。

回答1

1

ベストアンサー

System.Windows.Forms.MessageBoxは使わないでください。
MessageBox クラス (System.Windows.Forms) | Microsoft Docs

System.Windows.MessageBoxだけを使ってください。
MessageBox クラス (System.Windows) | Microsoft Docs

DialogResult result = MessageBox.ShowのようになっているのはWinForms用です(WPFでは使いません)
MessageBox.Show メソッド (System.Windows.Forms) | Microsoft Docs

MessageBoxResult result = MessageBox.Showこうなっているものを参考にしてください。
MessageBox.Show メソッド (System.Windows) | Microsoft Docs


.NETには同名のクラスがたくさんあります。

例えば「c# button」と検索すると、System.Windows.Forms.Button(WinForms用)の話が多く出てきます。
同じ部分も多いのですが、逆に些細な違いでハマります^^;

「wpf button」と検索するのをお勧めします(それでもWinFormsの話が混じったりすることもあるorz

FormやFormsという文字がチラッとでも見えたら警戒してください(WPFでFormという単語は普通使いません)
はっきり「何だ」と書いていないものや、かなり古い記事はWinFormsの可能性が高くなります。
WPFの記事はWPFと明示されていることが比較的多いです。

UWPやXamarinとも見分けづらいですが、それらはWPFよりもさらに少数派なのではっきり書いてあることがほとんどです。

投稿2022/04/29 02:17

編集2022/04/29 02:39
TN8001

総合スコア8037

tranokado👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

tranokado

2022/04/29 02:42

ありがとうございます! おかげでエラーがでず実行することができました。 ..実行することはできたのですが、確認ダイアログが表示される前に削除が実行されてしまいます。 下記コードべた貼りで申し訳ないのですが、原因わかりますでしょうか。 private void Name_DelButton_Click(object sender, RoutedEventArgs e) { MessageBoxResult result = MessageBox.Show("削除してもよろしいでしょうか", "確認", MessageBoxButton.YesNo); if (result == System.Windows.MessageBoxResult.Yes && nameListBox.SelectedItem is PersonalData data) { _data.Remove(data); } }
TN8001

2022/04/29 03:12

> ..実行することはできたのですが、確認ダイアログが表示される前に削除が実行されてしまいます。 削除された後にダイアログが表示されるということですか!? それともダイアログが出ないということでしょうか? 「ダイアログが出ない」なら下の削除ボタン(subName)を押しているってことはないですか。 「削除された後にダイアログが表示される」ってことはコード上あり得ないのですが、どう調べましょうかね^^; Debug.WriteLine(result);とか Debug.WriteLine("Remove");とかを所々に入れて本当に予想通りの値になっているかや通っているかの確認。 あるいはブレークポイントを張って止めてみる。 等、通常のデバッグ法でやるしかないでしょうか。。。
tranokado

2022/05/01 06:13

ご連絡遅くなり申し訳ございません! 一度visualstudioを再起動して実行することでなぜか問題なく挙動を確認することができました^^; また、winformsとの向き合い方について教えていただきありがとうございます。 ある程度少数派の方は明示されているということが多いのですね^^;

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

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

C#

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

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

WPF

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