IgbGrid では、列ごとの BodyTemplate テンプレートパラメータを指定することで、セル内に任意のコンテンツを配置することができます。これを利用して、IgbGrid 内の各行に、行を削除する用の「削除」ボタンを配置したセルを設けることができます。
また、テンプレート内では “context” という名前の変数 (テンプレート引数) で、IgbCellTemplateContext 型のオブジェクトを参照できます。この context を参照することで、テンプレートが適用された各行の情報を参照することができます。例えば前述の「削除」ボタンのクリックイベントの処理でこの context を参照することで、どの行の「削除」ボタンがクリックされたのかを判断できます。
下記はそのコード例です。
@* *.razor *@
<IgbGrid @ref="_Grid" Data="_SampleData" PrimaryKey="@nameof(PersonalInfo.Id)" ...>
...
<IgbColumn>
@* BodyTemplate テンプレートパラメータの中に、任意のコンテンツを配置できます。 *@
<BodyTemplate>
@* BodyTemplate 内では、"context" という名前の変数(テンプレート引数)
を参照でき、この context から、行ごとの情報を参照できます。 *@
<button @onclick="(() => OnClickDelete(context)">
削除
</button>
</BodyTemplate>
</IgbColumn>
...
</IgbGrid>
変数名 context でテンプレートに渡される IgbCellTemplateContext オブジェクトですが、このオブジェクトの .Cell.Id.RowID プロパティに、そのテンプレートを適用したデータ行の “主キー値” が格納されます。この主キー値は、IgbGrid の PrimaryKey プロパティで指定したフィールド名の値になります。つまり、「削除」ボタンのクリックイベントハンドラで context.Cell.Id.RowID を参照することで、その「削除」ボタンがクリックされた対象のデータ行を特定することができます。
なお、実際にデータ行を削除するには、前述の context を介して対象のデータ行を特定し、データソースから削除するだけは足りません。単にデータソース内から対象のデータ行を削除するだけだと、IgbGrid がそのデータ変更を検知できず、表示が更新されません。そのため、IgbGrid の NotifyRemoveItem メソッドを呼び出して、どのデータ行が削除されたのかを IgbGrid に明示的に知らせる必要があります。このようにすることで、IgbGrid の表示上も、対象のデータ行が消えるようになります。
以下はそのコード例です。
@* 先の *.razor の続き *@
@code
{
private IgbGrid? _Grid;
private readonly List<PersonalInfo> _SampleData = new()
{
...
};
/// <summary>
/// 各行の "削除" ボタンがクリックされたときに呼び出されます
/// </summary>
private void OnClickDelete(IgbCellTemplateContext context)
{
// コンテキストをもとに、削除対象のデータ行を特定します。
var targetIndex = _SampleData.FindIndex(
data => data.Id.ToString() == context.Cell.Id.RowID);
if (targetIndex == -1) throw new Exception("削除対象の行が見つかりません。");
var targetData = _SampleData[targetIndex];
// 実際にデータソースから対象データを削除します。
_SampleData.RemoveAt(targetIndex);
// それだけでは IgbGrid はデータ行が削除されたことの変更を検知できないため、
// IgbGrid の NotifyRemoveItem メソッドを呼び出して、どのデータ行が削除
// されたのかを IgbGrid に明示的に知らせます。これにより、IgbGrid は
// 表示を更新します。
_Grid?.NotifyRemoveItem(_SampleData, targetIndex, targetData);
}
}
完全に動作するサンプルプログラムの全体は下記 GItHub リポジトリを参照ください。
注意
BodyTemplate を使った IgbGrid を (Blazor WebAssembly ではなく) Blazor Server アプリケーション上で実行する場合、既定の構成だとサーバーとの通信が途切れる場合があります。その場合の対処方法については下記を参照ください。
「BodyTemplate を含む IgbGrid を Blazor Server で実行するとサーバーとの接続が切断される場合がある」
Pingback: IgbDataGridのセルにボタンを表示する – INFRAGISTICS ナレッジベース