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

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

新規登録して質問してみよう
ただいま回答率
87.20%
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クリップ

263閲覧

投稿2022/04/29 01:27

編集2022/05/01 15:13

前提・実現したいこと

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

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

試したこと

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

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

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

お聞きしたいこと

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

該当のソースコード

xaml

<Window x:Class="Qogxgft0o3rrwcj.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:dd="urn:gong-wpf-dragdrop" xmlns:local="clr-namespace:Qogxgft0o3rrwcj" Width="800" Height="450"> <Window.Resources> <local:ManagerDropHandler x:Key="ManagerDropHandler" /> <Style TargetType="Button"> <Setter Property="Margin" Value="10,5" /> <Setter Property="MinWidth" Value="80" /> </Style> <Style TargetType="GroupBox"> <Setter Property="BorderThickness" Value="0" /> </Style> </Window.Resources> <Grid Margin="10"> <Grid.ColumnDefinitions> <ColumnDefinition Width="10*" /> <ColumnDefinition Width="27*" /> </Grid.ColumnDefinitions> <DockPanel> <Button Click="OpenButton_Click" Content="開く" DockPanel.Dock="Top" /> <Button Click="SaveAsButton_Click" Content="保存" DockPanel.Dock="Top" /> <GroupBox Header="name"> <ListBox x:Name="nameListBox" dd:DragDrop.DropHandler="{StaticResource ManagerDropHandler}" dd:DragDrop.IsDragSource="True" dd:DragDrop.IsDropTarget="True" DisplayMemberPath="name" IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding}" /> </GroupBox> </DockPanel> <Grid Grid.Column="1"> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition /> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <DockPanel> <StackPanel DockPanel.Dock="Right"> <Button Click="Name_NewButton_Click" Content="新規" /> <Button Click="Name_DelButton_Click" Content="削除" /> </StackPanel> <StackPanel> <GroupBox DockPanel.Dock="Top" Header="name"> <TextBox Text="{Binding /name, UpdateSourceTrigger=PropertyChanged}" /> </GroupBox> <GroupBox DockPanel.Dock="Top" Header="URL"> <TextBox Text="{Binding /url, UpdateSourceTrigger=PropertyChanged}" /> </GroupBox> </StackPanel> </DockPanel> <GroupBox Grid.Row="1" Header="subname"> <ListBox x:Name="subNameListBox" dd:DragDrop.IsDragSource="True" dd:DragDrop.IsDropTarget="True" DisplayMemberPath="subname" IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding /manager_list}" /> </GroupBox> <DockPanel Grid.Row="2"> <StackPanel DockPanel.Dock="Right"> <Button Click="SubName_NewButton_Click" Content="新規" /> <Button Click="SubName_DelButton_Click" Content="削除" /> </StackPanel> <StackPanel> <GroupBox Header="subname"> <TextBox Text="{Binding /manager_list/subname, UpdateSourceTrigger=PropertyChanged}" /> </GroupBox> <GroupBox Header="address"> <TextBox Text="{Binding /manager_list/address, UpdateSourceTrigger=PropertyChanged}" /> </GroupBox> </StackPanel> </DockPanel> </Grid> </Grid> </Window>

C#

using System.Collections.ObjectModel; using System.IO; using System.Windows; using GongSolutions.Wpf.DragDrop; using GongSolutions.Wpf.DragDrop.Utilities; using Microsoft.Win32; using Newtonsoft.Json; using System.Windows.Forms; namespace Qogxgft0o3rrwcj { public class Manager { public string subname { get; set; } public string address { get; set; } } public class PersonalData { public string name { get; set; } public string url { get; set; } public ObservableCollection<Manager> manager_list { get; set; } } public partial class MainWindow : Window { private ObservableCollection<PersonalData> _data = new ObservableCollection<PersonalData>(); public MainWindow() { InitializeComponent(); DataContext = _data; Dummy(); } private void OpenButton_Click(object sender, RoutedEventArgs e) { var dialog = new OpenFileDialog { Filter = "json|*.json", }; if (dialog.ShowDialog() == true) { var json = File.ReadAllText(dialog.FileName); _data = JsonConvert.DeserializeObject<ObservableCollection<PersonalData>>(json); DataContext = _data; } } private void SaveAsButton_Click(object sender, RoutedEventArgs e) { var dialog = new SaveFileDialog { Filter = "json|*.json", }; if (dialog.ShowDialog() == true) { var json = JsonConvert.SerializeObject(_data, Formatting.Indented); File.WriteAllText(dialog.FileName, json); } } private void Name_NewButton_Click(object sender, RoutedEventArgs e) { var data = new PersonalData { name = "new name", manager_list = new ObservableCollection<Manager>(), }; _data.Add(data); nameListBox.SelectedItem = data; } private void Name_DelButton_Click(object sender, RoutedEventArgs e) { DialogResult result = MessageBox.Show("msg", "タイトル", MessageBoxButtons.YesNo); if (nameListBox.SelectedItem is PersonalData data) { _data.Remove(data); } } private void SubName_NewButton_Click(object sender, RoutedEventArgs e) { if (nameListBox.SelectedItem is PersonalData data) { var manager = new Manager { subname = "new subname", }; data.manager_list.Add(manager); subNameListBox.SelectedItem = manager; } } private void SubName_DelButton_Click(object sender, RoutedEventArgs e) { if (nameListBox.SelectedItem is PersonalData data && subNameListBox.SelectedItem is Manager manager) { data.manager_list.Remove(manager); } } private void Dummy() { if (File.Exists("test.json")) return; var json = @" [ { ""name"": ""tora"", ""url"": ""https:tora.com"", ""manager_list"": [ { ""subname"": ""tiger"", ""address"": ""chiba"" }, { ""subname"": ""tiger2"", ""address"": ""tokyo"" } ] }, { ""name"": ""cat"", ""url"": ""https:cat.com"", ""manager_list"": [ { ""subname"": ""neko"", ""address"": ""kanagawa"" }, { ""subname"": ""neko2"", ""address"": ""yokohama"" } ] } ] ".Trim(); File.WriteAllText("test.json", json); } } class ManagerDropHandler : DefaultDropHandler { public override void DragOver(IDropInfo dropInfo) { // nameListBox内アイテム並び替え(デフォルト動作) if (dropInfo.Data is PersonalData && dropInfo.TargetItem is PersonalData) { base.DragOver(dropInfo); } // subNameListBox→nameListBox アイテム移動・コピー(Ctrl+ドラッグ) else if (dropInfo.Data is Manager && dropInfo.TargetItem is PersonalData) { var isCopy = dropInfo.KeyStates.HasFlag(DragDropKeyStates.ControlKey); dropInfo.Effects = isCopy ? DragDropEffects.Copy : DragDropEffects.Move; dropInfo.DropTargetAdorner = DropTargetAdorners.Highlight; } } public override void Drop(IDropInfo dropInfo) { if (dropInfo?.DragInfo == null) return; // nameListBox内アイテム並び替え(デフォルト動作) if (dropInfo.Data is PersonalData && dropInfo.TargetItem is PersonalData) { base.Drop(dropInfo); } // subNameListBox→nameListBox アイテム移動・コピー(Ctrl+ドラッグ) else if (dropInfo.Data is Manager source && dropInfo.TargetItem is PersonalData target) { var sourceList = dropInfo.DragInfo.SourceCollection.TryGetList(); if (dropInfo.Effects == DragDropEffects.Copy) { var copy = new Manager { subname = source.subname, address = source.address, }; target.manager_list.Add(copy); } else if (dropInfo.Effects == DragDropEffects.Move) { sourceList.Remove(source); target.manager_list.Add(source); } } } } }

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

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;があるってことですか? そうです。そちらが過去コードと干渉してしまっている状況ですね。

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

C#

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

XAML

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

WPF

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