Lightning Blog
Blazor記事イメージ画像

【Blazor】 ドラッグ&ドロップの実装サンプル

更新日:2024/06/06
この記事では、Blazorを使ってシンプルなドラッグ&ドロップの実装方法について解説します。

    目次

  • サンプルコード
  • まとめ

サンプルコード

セクション画像

以下のコードは、Blazorでドラッグ&ドロップ機能の実装例です。


@page "/"
@using System.Diagnostics

@foreach (var item in _items)
{
    <div class="drag-and-drop-item"
         draggable="true"
         ondragover="event.preventDefault();"
         @ondragstart="() => DragStart(_items.IndexOf(item))"
         @ondrop="() => Drop(_items.IndexOf(item))">

        <span class="w-100">
            @item
        </span>
    </div>
}

@code {
    /// <summary>
    /// 項目リスト
    /// </summary>
    private List<string> _items = default!;

    /// <summary>
    /// ドラッグ中の項目のインデックス
    /// </summary>
    private int _draggingItemIndex;

    /// <summary>
    /// 初期化
    /// </summary>
    protected override void OnInitialized()
    {
        _items = new List<string>()
        {
            "apple",
            "orange",
            "banana"
        };
    }

    /// <summary>
    /// ドラッグ開始
    /// </summary>
    /// <param name="dragIndex">ドラッグするインデックス</param>
    private void DragStart(int dragIndex)
    {
        Debug.WriteLine("DragStart");
        _draggingItemIndex = dragIndex;
    }

    /// <summary>
    /// ドロップ
    /// </summary>
    /// <param name="dropIndex">drop先のインデックス</param>
    private void Drop(int dropIndex)
    {
        Debug.WriteLine("Drop");

        // ドラッグ中の項目とドロップ先の項目のインデックスが異なる場合は、交換する
        if (_draggingItemIndex != dropIndex)
        {
            SwapElements(_items, _draggingItemIndex, dropIndex);
        }
    }

    /// <summary>
    /// リストの要素を交換
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="list"></param>
    /// <param name="index1"></param>
    /// <param name="index2"></param>
    private void SwapElements<T>(List<T> list, int index1, int index2)
    {
        T temp = list[index1];
        list[index1] = list[index2];
        list[index2] = temp;
    }
}

.drag-and-drop-item {
    display: inline-flex;
    align-items: center;
    border: 1px solid #a57f39;
    border-radius: 10px;
    padding: 0.1rem 0.25rem;
    background-color: #ffeac4;
    font-size: 0.875rem;
    margin-right: 0.25rem;
}

div要素のdraggable="true"は、ユーザーがドラッグ可能にするために設定しています。 また、ondragover="event.preventDefault();"は、div要素デフォルトの動作をキャンセルし、この要素がドロップを受け入れ可能にします。

@ondragstartは、ユーザーがドラッグを開始した際に発火するイベントハンドラです。 このイベントハンドラに登録しているDragStartメソッドで、ドラッグ中の要素のインデックスを_draggingItemIndexに保持するようにしています。

@ondropは、要素が他のドラッグ可能な要素の上にドロップされた際に発火するイベントハンドラです。 このイベントハンドラに登録しているDropメソッドで、ドロップ元とドロップ先のインデックスを比較して、可能なら交換する処理を行っています。

実際の動作は、以下のようになります。ドラッグ&ドロップできることを確認してください。

動作確認

まとめ

セクション画像

今回は簡単にですが、ドラッグ&ドロップを使ったコンポーネントについて紹介しました。

実装にややクセがあるので、実装に困ったときは参考にしてみてください。
ブログ内の記事で書かれているサンプルコードは、GitHubから確認する事ができます。 是非参考にしてみてください。

この本では、Blazorの基本から高度なテクニックまで、実際のプロジェクトに役立つ知識を網羅しています。 初心者から経験者まで、Blazorを扱うすべての開発者にとっての必読書です。 この記事の執筆者も参考にした「Blazor入門」で、あなたのBlazorスキルを飛躍的に向上させませんか?

合わせて読みたい

カード画像
AWS S3にアクセスする方法

BlazorアプリケーションからAWS S3にアクセスする方法を解説。必要なライブラリのインストール、アクセスキーやシークレットキーの設定、サービスクラスの実装手順を詳細に説明します。

更新日:2024/05/21

カード画像
Gmailからメール送信するサンプル

BlazorServerからGmailを使ってメールを送るサンプルを紹介。Gmailアカウントのアプリパスワードの取得が必要で、2段階認証の設定とSMS受信デバイスと電話番号が必要。取得したアプリパスワードを用いて、Blazorでのメール送信プログラムのサンプルコードも提供。メールが正常に送信されると[送信完了]と表示される。

更新日:2023/06/06

An error has occurred. This application may no longer respond until reloaded. Reload 🗙