このコントロールは非推奨であり、Grid に置き換えられていることに注意してください。そのため、そのコントロールに移行することをお勧めします。これは新しい機能を受け取ることはなく、バグ修正は優先されません。コードベースをデータ グリッドに移行する際のヘルプや質問については、サポートにお問い合わせください。
Blazor Grid 編集
Ignite UI for Blazor Data Table / Data Grid は、一括更新のセルおよび行編集をサポートします。注: 現在、これは非テンプレート列に制限されています。
すぐに使用できる機能のフルセット は、ページング、ソート、フィルタリング、編集、グループ化から行と列の仮想化まで、あらゆる機能をカバーします。.NET 開発者には制限はありません。
Blazor Grid 編集の例
EXAMPLE
MODULES
DATA GENERATOR
DATA SOURCE
RAZOR
JS
CSS
using System;
using System.Net.Http;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Text;
using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using IgniteUI.Blazor.Controls;
namespace Infragistics.Samples
{
public class Program
{
public static async Task Main (string [] args )
{
var builder = WebAssemblyHostBuilder.CreateDefault(args);
builder.RootComponents.Add<App>("app" );
builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
builder.Services.AddIgniteUIBlazor(
typeof (IgbDataGridModule),
typeof (IgbGridColumnOptionsModule)
);
await builder.Build().RunAsync();
}
}
}
cs コピー using System;
using System.Collections.Generic;
using System.Linq;
namespace Infragistics.Samples
{
public static class DataGenerator
{
readonly static string [] websites = { ".com" , ".gov" , ".edu" , ".org" };
readonly static string [] emails = { "gmail.com" , "yahoo.com" , "twitter.com" };
readonly static string [] genders = { "male" , "female" };
readonly static string [] maleNames = { "Kyle" , "Oscar" , "Ralph" , "Mike" , "Bill" , "Frank" , "Howard" , "Jack" , "Larry" , "Pete" , "Steve" , "Vince" , "Mark" , "Alex" , "Max" , "Brian" , "Chris" , "Andrew" , "Martin" , "Mike" , "Steve" , "Glenn" , "Bruce" };
readonly static string [] femaleNames = { "Gina" , "Irene" , "Katie" , "Brenda" , "Casey" , "Fiona" , "Holly" , "Kate" , "Liz" , "Pamela" , "Nelly" , "Marisa" , "Monica" , "Anna" , "Jessica" , "Sofia" , "Isabella" , "Margo" , "Jane" , "Audrey" , "Sally" , "Melanie" , "Greta" , "Aurora" , "Sally" };
readonly static string [] lastNames = { "Adams" , "Crowley" , "Ellis" , "Martinez" , "Irvine" , "Maxwell" , "Clark" , "Owens" , "Rooney" , "Lincoln" , "Thomas" , "Spacey" , "MOrgan" , "King" , "Newton" , "Fitzgerald" , "Holmes" , "Jefferson" , "Landry" , "Berry" , "Perez" , "Spencer" , "Starr" , "Carter" , "Edwards" , "Stark" , "Johnson" , "Fitz" , "Chief" , "Blanc" , "Perry" , "Stone" , "Williams" , "Lane" , "Jobs" , "Adams" , "Power" , "Tesla" };
readonly static string [] countries = { "USA" , "UK" , "France" , "Canada" , "Poland" };
readonly static string [] citiesUS = { "New York" , "Los Angeles" , "Miami" , "San Francisco" , "San Diego" , "Las Vegas" };
readonly static string [] citiesUK = { "London" , "Liverpool" , "Manchester" };
readonly static string [] citiesFR = { "Paris" , "Marseille" , "Lyon" };
readonly static string [] citiesCA = { "Toronto" , "Vancouver" , "Montreal" };
readonly static string [] citiesPL = { "Krakow" , "Warsaw" , "Wroclaw" , "Gdansk" };
readonly static string [] citiesJP = { "Tokyo" , "Osaka" , "Kyoto" , "Yokohama" };
readonly static string [] citiesGR = { "Berlin" , "Bonn" , "Cologne" , "Munich" , "Hamburg" };
readonly static string [] roadSuffixes = { "Road" , "Street" , "Way" };
readonly static string [] roadNames = { "Main" , "Garden" , "Broad" , "Oak" , "Cedar" , "Park" , "Pine" , "Elm" , "Market" , "Hill" };
public static Random Rand = new Random();
public static string GetWebsite ( )
{
return GetItem(websites);
}
public static string GetEmail ( )
{
return GetItem(emails);
}
public static double GetNumber (double min, double max )
{
return Math.Round(min + (Rand.NextDouble() * (max - min)));
}
public static int GetInteger (double min, double max )
{
return (int )GetNumber(min, max);
}
public static string GetPhone ( )
{
var phoneCode = GetNumber(100 , 900 );
var phoneNum1 = GetNumber(100 , 900 );
var phoneNum2 = GetNumber(1000 , 9000 );
var phone = phoneCode + "-" + phoneNum1 + "-" + phoneNum2;
return phone;
}
public static string GetGender ( )
{
return GetItem(genders);
}
public static string GetNameFirst (string gender )
{
if (gender == "male" )
return GetItem(maleNames);
else
return GetItem(femaleNames);
}
public static string GetNameLast ( )
{
return GetItem(lastNames);
}
public static string GetItem (string [] array )
{
var index = (int )Math.Round(GetNumber(0 , array.Length - 1 ));
return array[index];
}
public static string GetCountry ( )
{
return GetItem(countries);
}
public static string GetCity (string country )
{
if (country == "Canada" )
{
return GetItem(citiesCA);
}
else if (country == "France" )
{
return GetItem(citiesFR);
}
else if (country == "Poland" )
{
return GetItem(citiesPL);
}
else if (country == "USA" )
{
return GetItem(citiesUS);
}
else if (country == "Japan" )
{
return GetItem(citiesJP);
}
else if (country == "Germany" )
{
return GetItem(citiesGR);
}
else
{
return GetItem(citiesUK);
}
}
public static string GetStreet ( )
{
var num = Math.Round(GetNumber(100 , 300 )).ToString();
var road = GetItem(roadNames);
var suffix = GetItem(roadSuffixes);
return num + " " + road + " " + suffix;
}
public static DateTime GetBirthday ( )
{
var year = DateTime.Now.Year - GetInteger(30 , 50 );
var month = GetNumber(10 , 12 );
var day = GetNumber(20 , 27 );
return new DateTime(year, (int )month, (int )day);
}
public static DateTime GetDate ( )
{
var year = DateTime.Now.Year;
var month = GetNumber(10 , 12 );
var day = GetNumber(20 , 27 );
return new DateTime(year, (int )month, (int )day);
}
public static string Pad (int num, int size )
{
var s = num + "" ;
while (s.Length < size)
{
s = "0" + s;
}
return s;
}
public static string GetPhotoMale (int id )
{
return "https://static.infragistics.com/xplatform/images/people/GUY" + Pad(id, 2 ) + ".png" ;
}
public static string GetPhotoFemale (int id )
{
return "https://static.infragistics.com/xplatform/images/people/GIRL" + Pad(id, 2 ) + ".png" ;
}
private static int maleCount = 0 ;
private static int femaleCount = 0 ;
public static string GetPhoto (string gender )
{
if (gender == "male" )
{
maleCount++;
if (maleCount > 24 ) maleCount = 1 ;
return GetPhotoMale(maleCount);
}
else
{
femaleCount++;
if (femaleCount > 24 ) femaleCount = 1 ;
return GetPhotoFemale(femaleCount);
}
}
public static string GetGenderPhoto (string gender )
{
return "https://static.infragistics.com/xplatform/images/genders/" + gender + ".png" ;
}
public static string GetCountryFlag (string country )
{
return "https://static.infragistics.com/xplatform/images/flags/" + country + ".png" ;
}
public static string GetIncomeRange (double salary )
{
if (salary < 50000 )
{
return "Low" ;
}
else if (salary < 100000 )
{
return "Average" ;
}
else
{
return "High" ;
}
}
}
}
cs コピー using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
namespace Infragistics.Samples
{
public class ObsEmployeeInfo : INotifyPropertyChanged
{
public string ID { get ; set ; }
public string Address { get ; set ; }
public double Age { get ; set ; }
public string Gender { get ; set ; }
public string FirstName { get ; set ; }
public string LastName { get ; set ; }
public string Name { get ; set ; }
public string Street { get ; set ; }
public string City { get ; set ; }
public string Email { get ; set ; }
public string Phone { get ; set ; }
public string Photo { get ; set ; }
public double Salary { get ; set ; }
public double Sales { get ; set ; }
public string Income { get ; set ; }
public int Index { get ; set ; }
public DateTime Birthday { get ; set ; }
public ObservableCollection<ObsEmployeeProductivity> Productivity { get ; set ; }
private string _Country;
public string Country
{
get { return _Country; }
set { if (_Country != value ) { OnCountryChanged(value ); } }
}
public string CountryFlag { get ; set ; }
protected void OnCountryChanged (string countryName )
{
_Country = countryName;
CountryFlag = DataGenerator.GetCountryFlag(countryName);
City = DataGenerator.GetCity(countryName);
OnPropertyChanged("Country" );
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged (string propertyName )
{
if (PropertyChanged != null )
{
PropertyChanged(this , new PropertyChangedEventArgs(propertyName));
}
}
}
public class ObsEmployeeProductivity
{
public double Value { get ; set ; }
public int Week { get ; set ; }
}
public static class ObsEmployeeData
{
public static ObservableCollection<ObsEmployeeInfo> Create (int ? count, bool ? useProductivity )
{
if (count == null ) count = 100 ;
var employees = new ObservableCollection<ObsEmployeeInfo>();
for (int i = 0 ; i < count; i++)
{
var age = Math.Round(DataGenerator.GetNumber(20 , 40 ));
var gender = DataGenerator.GetGender();
var firstName = DataGenerator.GetNameFirst(gender);
var lastName = DataGenerator.GetNameLast();
var street = DataGenerator.GetStreet();
var country = DataGenerator.GetCountry();
var city = DataGenerator.GetCity(country);
var email = firstName.ToLower() + "@" + DataGenerator.GetEmail();
var photoPath = DataGenerator.GetPhoto(gender);
var employee = new ObsEmployeeInfo
{
Index = i,
Address = street + ", " + city,
Age = age,
Birthday = DataGenerator.GetBirthday(),
City = city,
Email = email,
Gender = gender,
ID = DataGenerator.Pad(1001 + i, 4 ),
FirstName = firstName,
LastName = lastName,
Name = firstName + " " + lastName,
Photo = photoPath,
Phone = DataGenerator.GetPhone(),
Street = DataGenerator.GetStreet(),
Salary = DataGenerator.GetNumber(40 , 200 ) * 1000 ,
Sales = DataGenerator.GetNumber(200 , 980 ) * 1000 ,
};
employee.Country = country;
employee.Income = DataGenerator.GetIncomeRange(employee.Salary);
if (useProductivity.HasValue && useProductivity.Value)
{
employee.Productivity = GetProductivity(52 );
}
employees.Add(employee);
}
return employees;
}
public static ObservableCollection<ObsEmployeeProductivity> GetProductivity (int weekCount )
{
var productivity = new ObservableCollection<ObsEmployeeProductivity>();
for (var w = 1 ; w <= weekCount; w++)
{
var value = DataGenerator.GetNumber(-50 , 50 );
var prod = new ObsEmployeeProductivity
{
Value = value ,
Week = w
};
productivity.Add(prod);
};
return productivity;
}
}
}
cs コピー
@using System.Collections.ObjectModel
@using IgniteUI.Blazor.Controls
<div class ="container vertical" >
<div class ="options horizontal" >
<button @onclick ="OnCommitClick" disabled ="@ ButtonsDisabled " > Commit</button >
<button @onclick ="OnUndoClick" disabled ="@ ButtonsDisabled " > Undo</button >
<button @onclick ="OnRedoClick" disabled ="@ ButtonsDisabled " > Redo</button >
<label >
Edit Mode:
<select @bind ="GridEditMode" >
<option > @ EditModeType.None </option >
<option > @ EditModeType.Cell </option >
<option > @ EditModeType.CellBatch </option >
<option > @ EditModeType.Row </option >
</select >
</label >
<label >
Excel-style Editing
<select @bind ="GridEditModeClickAction" >
<option > @ EditModeClickAction.SingleClick </option >
<option > @ EditModeClickAction.DoubleClick </option >
</select >
</label >
</div >
<div class ="container vertical" >
@ if (Data != null )
{
<div style ="overflow: hidden" >
<IgbDataGrid Height ="100%" Width ="100%" @ref ="DataGridRef"
EditModeClickAction ="@ GridEditModeClickAction "
DefaultColumnMinWidth ="120"
AutoGenerateColumns ="false"
DataSource ="Data"
EditMode ="@ GridEditMode "
ActivationMode ="@ GridActivationMode.Cell "
SelectionMode ="@ DataGridSelectionMode.SingleRow "
SelectionBehavior ="@ GridSelectionBehavior.ModifierBased "
IsColumnOptionsEnabled ="true"
RowEditStarted ="OnRowEditStarted"
RowEditEnded ="OnRowEditEnded" >
<IgbTextColumn Field ="Name" Width ="@( "*>150" ) " />
<IgbTextColumn Field ="Street" HeaderText ="Street" Width ="@( "*>160" ) " />
<IgbTextColumn Field ="City" HeaderText ="City" Width ="@( "*>120" ) " />
<IgbNumericColumn Field ="Salary" HeaderText ="Salary" PositivePrefix ="$" ShowGroupingSeparator ="true" Width ="@( "*>120" ) " />
<IgbImageColumn IsEditable ="false" Field ="Photo" HeaderText ="Photo" ContentOpacity ="1" HorizontalAlignment ="@ CellContentHorizontalAlignment.Center " Width ="@( "*>110" ) " />
<IgbDateTimeColumn Field ="Birthday" HeaderText ="Date of Birth" Width ="@( "*>170" ) " />
<IgbTemplateColumn Field ="ButtonColumn" HeaderText ="Delete Row" CellUpdatingScript ="onUpdatingTemplateColumn" />
</IgbDataGrid >
</div >
}
</div >
</div >
@code {
public static IgbDataGrid DataGridRef;
private EditModeClickAction GridEditModeClickAction = EditModeClickAction.SingleClick;
private EditModeType _editMode;
public EditModeType GridEditMode
{
get { return _editMode; }
set
{
_editMode = value ;
if (_editMode == EditModeType.CellBatch)
{
ButtonsDisabled = false ;
}
else
{
ButtonsDisabled = true ;
}
}
}
private bool ButtonsDisabled { get ; set ; }
public static ObservableCollection <ObsEmployeeInfo > Data { get ; set ; }
protected override void OnInitialized ( )
{
Data = ObsEmployeeData.Create(100 , false );
this .GridEditMode = EditModeType.Cell;
}
private void OnCommitClick (MouseEventArgs e )
{
DataGridRef.CommitEdits();
StateHasChanged();
}
private void OnUndoClick (MouseEventArgs e )
{
DataGridRef.Undo();
StateHasChanged();
}
private void OnRedoClick (MouseEventArgs e )
{
DataGridRef.Redo();
StateHasChanged();
}
private void OnRowEditEnded (IgbGridRowEditEndedEventArgs e )
{
if (_editMode == EditModeType.CellBatch)
{
ButtonsDisabled = false ;
}
else
{
ButtonsDisabled = true ;
}
StateHasChanged();
}
private void OnRowEditStarted (IgbGridRowEditStartedEventArgs e )
{
if (_editMode == EditModeType.CellBatch)
{
ButtonsDisabled = true ;
}
else
{
ButtonsDisabled = false ;
}
StateHasChanged();
}
[JSInvokable ]
public static void ButtonClickActionAtBlazorLevel (object parameter )
{
int param = int .Parse(parameter.ToString());
var rowItem = DataGridRef.ActualDataSource.GetItemAtIndex(param);
DataGridRef.RemoveItem(rowItem);
}
}
razor コピー function onUpdatingTemplateColumn (grid, args ) {
let content = args.content;
var row = args.cellInfo.dataRow;
if (content.childElementCount === 0 ) {
var deleteButton = document .createElement("button" );
deleteButton.id = row;
var deleteSpan = document .createElement("span" );
deleteSpan.textContent = "DELETE" ;
deleteButton.appendChild(deleteSpan);
deleteButton.onclick = function ( ) {
var button = deleteButton;
DotNet.invokeMethodAsync('Infragistics.Samples' , 'ButtonClickActionAtBlazorLevel' , button.id);
}
content.appendChild(deleteButton);
}
}
igRegisterScript("onUpdatingTemplateColumn" , onUpdatingTemplateColumn, false );
js コピー
このサンプルが気に入りましたか? 完全な Ignite UI for Blazorツールキットにアクセスして、すばやく独自のアプリの作成を開始します。無料でダウンロードできます。
概要
Blazor データ グリッドの編集は、Blazor グリッドの EditMode
オプションを使用して設定します。このプロパティには、以下にリストされている 3 つの異なるオプションがあります。
None
: 編集は有効ではありません。
Cell
: セルが編集モードに入り、編集モードの終了時に値をコミットできるようにします。
CellBatch
: セルが編集モードに入りますが、変更はコミットされるまで後でキャッシュされます。
Row
: 行が編集モードに入り、編集モードの終了時に値をコミットできるようにします。
CellBatch
に設定した場合、変更をコミットするにはグリッドから commitEdits
メソッドを実行する必要があります。グリッドは、コミットされるまでセルを斜体で表示し、変更をデータ ソースにプッシュするタイミングを制御します。
さらに、onCellValueChanging
イベントをフックし、コミットされる前に新しい値を調べることでエラー処理を実行できます。グリッドはエラー メッセージを出力できる setEditError
メソッドを公開します。これにより、有効な値が入力されるまで、セルを編集モードに維持します。それ以外の場合は、グリッドの rejectEdit
メソッドを実行して無効な値を元に戻すことができます。無効な値が見つからない場合、グリッドの acceptEdit
メソッドを呼び出して変更をコミットすることもできます。
コミットは、acceptCommit
または rejectCommit
メソッドで onDataCommitting
をフックし、commitID
イベント引数をパラメーターとして渡すことで、グリッド レベルで承認または拒否できます。このイベントは、コミットされる前のすべての変更を保存する changes
コレクションも公開します。たとえば、コミットが追加、更新、削除操作のいずれであるかを changes
コレクションで公開された TransactionType
プロパティによって確認し、必要に応じて acceptCommit
または rejectCommit
を実行できます。
Excel スタイル編集
EditOnKeyPress
を使用すると、Excel の動作と同じように、入力時にすぐに編集を開始できます。さらに、EditModeClickAction
プロパティを SingleClick
に設定して、ユーザーが他のセルに移動しながらセルをすばやく編集できるようにすることができます。デフォルトでは、編集モードに入るにはダブル クリックが必要です。
コード スニペット
以下は、データ グリッドで編集を設定し、データをコミットする方法を示します。
<IgbDataGrid Height ="100%" Width ="100%" @ref ="DataGridRef"
DataSource ="DataSource"
EditMode ="EditModeType.CellBatch" />
<button @onclick ="OnCommitClick" > Commit Data</button >
@code {
public IgbDataGrid DataGridRef;
private void OnCommitClick (MouseEventArgs e )
{
this .DataGridRef.CommitEdits();
}
}
razor
一括変更を元に戻す/やり直し
以下は、一括更新が有効な場合に変更を元に戻す方法を示しています。
<IgbDataGrid Height ="100%" Width ="100%" @ref ="DataGridRef"
DataSource ="DataSource"
EditMode ="EditModeType.CellBatch" />
<button @onclick ="OnUndoClick" > Undo</button >
<button @onclick ="OnRedoClick" > Redo</button >
@code {
public IgbDataGrid DataGridRef;
private void OnUndoClick (MouseEventArgs e )
{
this .DataGridRef.Undo();
}
private void OnRedoClick (MouseEventArgs e )
{
this .DataGridRef.Redo();
}
}
razor
エラー検証とコミットの整合性
以下は、編集モードを終了するときにセルが空かどうかを確認し、更新されたセルからのコミットのみを受け入れることによって、エラーを組み込む方法を示しています。
<IgbDataGrid Height ="100%" Width ="100%"
@ref ="DataGridRef"
CellValueChanging ="OnCellValueChanging"
DataCommitting ="OnDataCommitting" >
</IgbDataGrid >
@code {
public IgbDataGrid DataGridRef;
public void OnCellValueChanging (IgbGridCellValueChangingEventArgs e )
{
if (e.NewValue == "" )
{
this .DataGridRef.SetEditError(e.EditID, "Error, cell is empty" );
this .DataGridRef.RejectEdit(e.EditID);
}
else
{
this .DataGridRef.AcceptEdit(e.EditID);
}
}
public void OnDataCommitting (IgbGridDataCommittingEventArgs e )
{
if (e.Changes[0 ].TransactionType == TransactionType.Update)
{
this .DataGridRef.AcceptCommit(e.CommitID);
}
else
{
this .DataGridRef.RejectCommit(e.CommitID);
}
}
}
razor
API リファレンス