プログラムを書こう!

実務や自作アプリ開発で習得した役に立つソフトウェア技術情報を発信するブログ

WPFのDataGridでセルの選択単位を設定する。

この記事は2019年04月25日に投稿しました。

目次

  1. はじめに
  2. WPFのDataGridでセルの選択単位を設定する
  3. おわりに

エッセンシャルWPF:Windows Presentation Foundation (Programmer's SELECTION)

エッセンシャルWPF:Windows Presentation Foundation (Programmer's SELECTION)

1. はじめに

こんにちは、iOSのエディタアプリPWEditorの開発者の二俣です。
今回は業務で使用しているWPFのDataGridでセルの選択単位を設定する方法についてです。

目次へ

2. WPFのDataGridでセルの選択単位を設定する

WPFDataGridでセルの選択単位を設定するには、DataGridタグのSelectionUnitに以下の設定を行います。

設定値

定数 内容
Cell 0 セルのみ選択できます。
セルをクリックすると、そのセルが選択されます。
行ヘッダーまたは列ヘッダーをクリックしても、何も実行されません。
CellOrRowHeader 2 セルと行を選択できます。
セルをクリックすると、そのセルのみが選択されます。
行ヘッダーをクリックすると、その行全体が選択されます。
FullRow 1 行全体のみ選択できます。
セルまたは行ヘッダーをクリックすると、その行全体が選択されます。

目次へ

3. おわりに

今回の要件でセル単位で選択するため、設定方法を調べてみました。

未経験からプログラマーへの転職率95.1%

目次へ

WPFのDataGridで行削除の許可/不許可を設定する。

この記事は2019年04月24日に投稿しました。

目次

  1. はじめに
  2. WPFのDataGridで行削除の許可/不許可を設定する
  3. おわりに

エッセンシャルWPF:Windows Presentation Foundation (Programmer's SELECTION)

エッセンシャルWPF:Windows Presentation Foundation (Programmer's SELECTION)

1. はじめに

こんにちは、iOSのエディタアプリPWEditorの開発者の二俣です。
今回は業務で使用しているWPFのDataGridで行削除の許可/不許可を設定する方法についてです。

目次へ

2. WPFのDataGridで行削除の許可/不許可を設定する

WPFのDataGridで行削除の許可/不許可を設定するにはDataGridタグにCanUserDeleteRows="false"(許可)またはCanUserDeleteRows="false"(不許可)を設定します。

<DataGrid CanUserDeleteRows="false">
...
</DataGrid>

目次へ

3. おわりに

先日の

paveway.hatenablog.com

と同様DataGridを表示のみで使用するため、行削除を不許可にしました。

完全無料でJavaを学ぶ0円スクール【0円スクール(完全無料のJavaスクール)】

目次へ

WPFのDataGridで新規行追加の許可/不許可を設定する。

この記事は2019年04月23日に投稿しました。

目次

  1. はじめに
  2. WPFのDataGridで新規行追加の許可/不許可を設定する
  3. おわりに

エッセンシャルWPF:Windows Presentation Foundation (Programmer's SELECTION)

エッセンシャルWPF:Windows Presentation Foundation (Programmer's SELECTION)

1. はじめに

こんにちは、iOSのエディタアプリPWEditorの開発者の二俣です。
今回は業務で使用しているWPFのDataGridで新規行追加の許可/不許可を設定する方法についてです。

目次へ

2. WPFのDataGridで新規行追加の許可/不許可を設定する

WPFのDataGridで新規行追加の許可/不許可を設定するにはDataGridタグにCanUserAddRows="true"(許可)またはCanUserAddRows="false"(不許可)を設定します。

実装例

<DataGrid CanUserAddRows="false">
...
</DataGrid>

目次へ

3. おわりに

DataGridを表示のみで使用するため、新規行追加を不許可にしました。

【Tech Stars Agent】

目次へ

WPFのDatePickerの初期値に当日の年月日を表示する。

この記事は2019年04月22日に投稿しました。

目次

  1. はじめに
  2. WPFのDatePickerの初期値に当日の年月日を表示する
  3. おわりに

エッセンシャルWPF:Windows Presentation Foundation (Programmer's SELECTION)

エッセンシャルWPF:Windows Presentation Foundation (Programmer's SELECTION)

1. はじめに

こんにちは、iOSのエディタアプリPWEditorの開発者の二俣です。
今回は業務で使用しているWPFのDatePickerの初期値に当日の年月日を表示する方法についてです。

目次へ

2. WPFのDatePickerの初期値に当日の年月日を表示する

WPFのDatePickerの初期値に当日の年月日を表示するには、以下のようにします。

  1. \<Windows>タグに、xmlns:System=\"clr-namespace:System;assembly=mscorlib\"を追加します。
  2. \<DataPicer>タグに、SelectedDate="{Binding Source={x:Static System:DateTime.Today}, Mode=OneTime}"を設定します。
<Window x:Class="WPFDatePickerToday.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:System="clr-namespace:System;assembly=mscorlib"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WPFDatePickerToday"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <DatePicker SelectedDate="{Binding Source={x:Static System:DateTime.Today}, Mode=OneTime}"/>
    </Grid>
</Window>

目次へ

3. おわりに

WPFでDatePicerを追加したところ、初期値に"年月日"文字列が表示されました。
当日の年月日を表示したかったため、表示方法を調べてみました。

GEEK JOB

目次へ

WPFでアプリの2重起動を禁止する。

この記事は2019年04月21日に投稿しました。

目次

  1. はじめに
  2. WPFでアプリの2重起動を禁止する
  3. おわりに

エッセンシャルWPF:Windows Presentation Foundation (Programmer's SELECTION)

エッセンシャルWPF:Windows Presentation Foundation (Programmer's SELECTION)

1. はじめに

こんにちは、iOSのエディタアプリPWEditorの開発者の二俣です。
今回は業務で使用しているWPFでアプリの2重起動を禁止する方法についてです。

目次へ

2. WPFでアプリの2重起動を禁止する

WPFでアプリの2重起動を禁止する以下のような実装になります。

実装例

App.xaml

StartupUri="MainView.xaml"Startup="ApplicationStartup"に変更します。

<Application x:Class="WPFMultiActivate.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WPFMultiActivate"
             Startup="ApplicationStartup">
    <Application.Resources>
         
    </Application.Resources>
</Application>
App.xaml.cs
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
using System.Threading; // Mutexを使用するため追加します。

namespace Sample
{
    /// <summary>
    /// App.xaml の相互作用ロジック
    /// </summary>
    public partial class App : Application
    {
        // Mutexの名前
        // 本来は一意になるような名前にします。
        private static readonly string mutexName = "Sample";

        // Mutexを生成します。
        private static readonly Mutex mutex = new Mutex(false, mutexName);

        // Mutexの所有権の有無を保持するフラグ(true:所有権有り/false:所有権無し)
        private static bool hasHandle = false;

        /**
         * @breif Startupイベントを発生させます。
         * 
         * @param [in] e イベント
         */
        protected override void OnStartup(StartupEventArgs e)
        {
            // Mutexの所有権を取得します。
            // 最初に起動したアプリのみ所有権を取得できます。
            hasHandle = mutex.WaitOne(0, false);

            // 取得できない場合、すでに起動済みとみなします。
            if (!hasHandle)
            {
                MessageBox.Show("2重起動できません。");

                // アプリケーションを終了します。
                this.Shutdown();
                return;
            }

            // 親クラスのメソッドを呼び出します。
            base.OnStartup(e);
        }

        /**
         * @breif Exitイベントを発生させます。
         * 
         * @param [in] e イベント
         */
        protected override void OnExit(ExitEventArgs e)
        {
            // 親クラスのメソッドを呼び出します。
            base.OnExit(e);

            // Mutexの所有権を保持している場合
            if (hasHandle)
            {
                // Mutexを解放します。
                mutex.ReleaseMutex();
            }

            // Mutexをクローズします。
            mutex.Close();
        }

        /**
         * @brief アプリケーションの起動処理を行います。
         *
         * @param [in] sender
         * @param [in] e イベント
         */
        private void ApplicationStartup(object sender, StartupEventArgs e)
        {
            // 画面を表示します。
            var windows = new MainWindow();
            windows.Show();
        }
    }
}

目次へ

3. おわりに

以前MFC

paveway.hatenablog.com

C#

paveway.hatenablog.com

でアプリの2重起動の禁止について紹介しました。

今回WPFを業務で使用するため、勉強がてらWPFでアプリの2重起動の禁止処理について調べてみました。

完全無料でJavaを学ぶ0円スクール【0円スクール(完全無料のJavaスクール)】

目次へ

C#のDataGridViewでセルをドラックアンドドロップでコピーする。

この記事は2019年04月20日に投稿しました。

目次

  1. はじめに
  2. C#のDataGridViewでセルをドラックアンドドロップでコピーする
  3. おわりに

新・標準プログラマーズライブラリ なるほどなっとく C#入門

新・標準プログラマーズライブラリ なるほどなっとく C#入門

1. はじめに

こんにちは、iOSのエディタアプリPWEditorの開発者の二俣です。
今回は業務で使用しているC#のDataGridViewでセルをドラックアンドドロップでコピーする方法についてです。

目次へ

2. C#のDataGridViewでセルをドラックアンドドロップでコピーする

C#のDataGridViewでセルをドラックアンドドロップでコピーするには以下のような実装になります。

フォームにDataGridViewが2つ配置されている(それぞれdataGridView1, dataGridView2)とします。

実装例

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Sample
{
    public partial class Form1 : Form
    {
        /**
         * @brief コンストラクタ
         */
        public Form1()
        {
            InitializeComponent();
        }

        /**
         * @brief フォームがロードされた時に呼び出されます。
         * 
         * @param [in] sender フォーム
         * @param [in] e イベント
         */
        private void Form1_Load(object sender, EventArgs e)
        {
            // サンプルデータを設定します。
            // ドロップ元のDataGridView
            dataGridView1.ColumnCount = 3;
            dataGridView1.Columns[0].HeaderText = "値A";
            dataGridView1.Columns[1].HeaderText = "値B";
            dataGridView1.Columns[2].HeaderText = "値C";
            dataGridView1.Rows.Add("A-1", "B-1", "C-1");
            dataGridView1.Rows.Add("A-2", "B-2", "C-2");
            dataGridView1.Rows.Add("A-3", "B-3", "C-3");

            // 選択モードをセルに設定します。
            dataGridView1.SelectionMode = DataGridViewSelectionMode.CellSelect;

            // ドロップ先のDataGridView
            dataGridView2.ColumnCount = 3;
            dataGridView2.Columns[0].HeaderText = "値X";
            dataGridView2.Columns[1].HeaderText = "値Y";
            dataGridView2.Columns[2].HeaderText = "値Z";
            dataGridView2.Rows.Add("X-1", "Y-1", "Z-1");
            dataGridView2.Rows.Add("X-2", "Y-2", "Z-2");
            dataGridView2.Rows.Add("X-3", "Y-3", "Z-3");

            // ドロップを許可します。
            dataGridView2.AllowDrop = true;
        }

        /**
         * @brief マウスのボタンが押下された時に呼び出されます。
         * 
         * @param [in] sender マウスのボタン
         * @param [in] e イベント
         */
        private void dataGridView1_MouseDown(object sender, MouseEventArgs e)
        {
            // マウスの左ボタン以外が押下された場合
            if (e.Button != MouseButtons.Left)
            {
                // 何もしません。
                return;
            }

            // マウスが押下された座標から、dataGridViewの位置情報を取得します。
            var hitTest = dataGridView1.HitTest(e.X, e.Y);
            int rowIndex = hitTest.RowIndex;
            int columnIndex = hitTest.ColumnIndex;

            // ヘッダ列、ヘッダ行の場合
            if ((rowIndex < 0) || (columnIndex < 0))
            {
                // 何もしません。
                return;
            }

            // ドロップ元(dataGridView1)のセルの内容を取得します。
            var text = (string)dataGridView1.Rows[rowIndex].Cells[columnIndex].Value;

            // セルの内容が取得できない場合
            if (text == null)
            {
                // 何もしません。
                return;
            }

            // ドラッグアンドドロップ動作を開始します。
            dataGridView1.DoDragDrop(text, DragDropEffects.Copy);
        }

        /**
         * @brief ドラッグされた場合呼び出されます。
         * 
         * @param [in] sender 対象のコントロール
         * @parma [in] e イベント
         */
        private void dataGridView2_DragEnter(object sender, DragEventArgs e)
        {
            // ドラッグアンドドロップのドロップ効果をコピーに設定します。
            e.Effect = DragDropEffects.Copy;
        }

        /**
         * @brief ドラッグアンドドロップでドロップされた時に呼び出されます。
         * 
         * @param [in] sender 対象のコントロール
         * @parma [in] e イベント
         */
        private void dataGridView2_DragDrop(object sender, DragEventArgs e)
        {
            // ドロップ先(dataGridView2)のクライアント位置からDataGridViewの位置情報を取得します。
            var value = e.Data.GetData(typeof(string)) as string;
            var point = dataGridView2.PointToClient(new Point(e.X, e.Y));
            var hitTest = dataGridView2.HitTest(point.X, point.Y);
            int columnIndex = hitTest.ColumnIndex;
            int rowIndex = hitTest.RowIndex;

            // ヘッダ列、ヘッダ行ではない場合
            if ((columnIndex != -1) && (rowIndex != -1))
            {
                // ドロップ元(dataGridView1)のセルの内容を、
                // ドロップ先(dataGridView2)のセルにコピーします。
                dataGridView2[columnIndex, rowIndex].Value = value;
            }
        }
    }
}

目次へ

3. おわりに

前回

paveway.hatenablog.com

行の移動を紹介しましたが、今回はセルの内容をコピーしたいという要望もあったので、続けて調査しました。

今のシゴトに飽きちゃった...そんなあなたの見方です!【IT派遣テクノウェイブ】

作って覚えるVisual C# 2017 デスクトップアプリ入門

作って覚えるVisual C# 2017 デスクトップアプリ入門

目次へ

C#のDataGridViewで行をドラックアンドドロップする。

この記事は2019年04月19日に投稿しました。

目次

  1. はじめに
  2. C#のDataGridViewで行をドラックアンドドロップする
  3. おわりに

1. はじめに

こんにちは、iOSのエディタアプリPWEditorの開発者の二俣です。
今回は業務で使用しているC#のDataGridViewで行をドラックアンドドロップする方法についてです。

目次へ

2. C#のDataGridViewで行をドラックアンドドロップする

C#のDataGridViewで行をドラックアンドドロップするには以下のような実装になります。

フォームにDataGridViewが2つ配置されている(それぞれdataGridView1, dataGridView2)とします。

実装例

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Sample
{
    public partial class Form1 : Form
    {
        /**
         * @brief コンストラクタ
         */
        public Form1()
        {
            InitializeComponent();
        }

        /**
         * @brief dataGridView1でマウスが移動した時に呼び出されます。
         *
         * @param [in] sender マウス
         * @param [in] e イベント
         */
        private void dataGridView1_MouseMove(object sender, MouseEventArgs e)
        {
            // マウス座標のDataGridViewの位置情報を取得します。
            var hitTest = dataGridView1.HitTest(e.X, e.Y);

            // 念のため、有効なセル上でのみ許可する
            int newRowIndex = dataGridView1.NewRowIndex;
            int rowIndex = hitTest.RowIndex;
            if ((hitTest.Type == DataGridViewHitTestType.Cell)
                && ((newRowIndex == -1) || (newRowIndex != rowIndex)))
            {
                // ドラッグアンドドロップ動作を開始します。
                var row = dataGridView1.Rows[rowIndex];
                dataGridView1.DoDragDrop(row, DragDropEffects.Copy);
            }
        }

        /**
         * @brief ドラッグされた場合呼び出されます。
         * 
         * @param [in] sender 対象のコントロール
         * @parma [in] e イベント
         */
        private void dataGridView2_DragEnter(object sender, DragEventArgs e)
        {
            // ドラッグアンドドロップのドロップ効果をコピーに設定します。
            e.Effect = DragDropEffects.Copy;
        }

        /**
         * @brief ドラッグアンドドロップでドロップされた時に呼び出されます。
         * 
         * @param [in] sender 対象のコントロール
         * @parma [in] e イベント
         */
        private void dataGridView2_DragDrop(object sender, DragEventArgs e)
        {
            // ドロップ元(dataGridView1)のデータを取得します。
            var row = (DataGridViewRow)e.Data.GetData(typeof(DataGridViewRow));
            var cellDataNum = row.Cells.Count;
            var cellData = new object[cellDataNum];
            for (int column = 0; column < cellDataNum; ++column)
            {
                cellData[column] = row.Cells[column].Value;
            }

            // ドロップ先(dataGridView2)のクライアント位置からDataGridViewの位置情報を取得します。
            var point = dataGridView2.PointToClient(new Point(e.X, e.Y));
            var hitTest = dataGridView2.HitTest(point.X, point.Y);

            // ドロップ先(dataGridView2)の行位置を取得します。
            int rowIndex = hitTest.RowIndex;

            // ドロップ先(dataGridView2)の行位置がヘッダー行では無い場合
            if (rowIndex != -1)
            {
                // 該当行に挿入します。
                dataGridView2.Rows.Insert(rowIndex, cellData);
            }

            // ドロップ先(dataGridView2)の行位置がヘッダー行の場合
            else
            {
                // 末尾に行を追加します。
                dataGridView2.Rows.Add(cellData);
            }

            // 移動する場合、元のdataGridView1から該当行を削除します。
            // コピーする場合、以下の行はコメントアウトしてください。
            row.DataGridView.Rows.Remove(row);
        }
}

目次へ

3. おわりに

今回の要件で、ある表から別の表に行を移動したいという要望がありました。
そのためDataGridViewで実現可能か調査しました。

GEEK JOB

確かな力が身につくC#「超」入門 (Informatics&IDEA)

確かな力が身につくC#「超」入門 (Informatics&IDEA)

目次へ