React Grid 셀 활성화
Ignite UI for React 그리드 셀을 키보드로 탐색할 수 있는 셀 활성화 기능을 지원합니다. 이는 그리드의 activationMode
속성을 Cell
로 설정하여 활성화합니다.
React Grid 셀 활성화 예제
export class DataGridSharedData {
public static getEmployees(count?: number): any[] {
if (count === undefined) {
count = 250;
}
const employees: any[] = [];
let maleCount: number = 0;
let femaleCount: number = 0;
for (let i = 0; i < count; i++) {
const age: number = Math.round(this.getRandomNumber(20, 40));
const gender: string = this.getRandomGender();
const firstName: string = this.getRandomNameFirst(gender);
const lastName: string = this.getRandomNameLast();
const street: string = this.getRandomStreet();
const country: string = this.getRandomItem(this.countries);
const city: string = this.getRandomCity(country);
const generation = Math.floor(age / 10) * 10 + "s";
const email: string = firstName.toLowerCase() + "@" + this.getRandomItem(this.emails);
const website: string = firstName.toLowerCase() + "-" + this.getRandomItem(this.websites);
let photoPath: any;
if (gender === "male") {
maleCount++;
if (maleCount > 26) {
maleCount = 1;
}
photoPath = this.getPhotoMale(maleCount);
}
else {
femaleCount++;
if (femaleCount > 24) {
femaleCount = 1;
}
photoPath = this.getPhotoFemale(femaleCount);
}
let person: any = {};
person.Address = street + "," + city;
person.Age = age;
person.Birthday = this.getBirthday(age);
person.City = city;
person.Country = country;
person.CountryFlag = this.getCountryFlag(country);
person.Email = email;
person.FirstName = firstName;
person.Gender = this.getGenderPhoto(gender);
person.Generation = generation;
person.ID = this.pad(i + 1, 5);
person.LastName = lastName;
person.Name = firstName + " " + lastName;
person.Phone = this.getRandomPhone();
person.Photo = photoPath;
person.Street = street;
person.Salary = this.getRandomNumber(40, 200) * 1000;
person.Sales = this.getRandomNumber(200, 980) * 1000;
person.Website = website;
person.Productivity = this.getProductivity();
if (person.Salary < 50000) {
person.Income = "Low";
} else if (person.Salary < 100000) {
person.Income = "Average";
} else {
person.Income = "High";
}
employees.push(person);
}
return employees;
}
public static getProductivity(weekCount?: number): any[] {
if (weekCount === undefined) {
weekCount = 52;
}
const productivity: any[] = [];
for (let w = 0; w < weekCount; w++) {
const value = this.getRandomNumber(-50, 50);
productivity.push({Value: value, Week: w});
}
return productivity;
}
public static getSales(count?: number): any[] {
if (count === undefined) {
count = 250;
}
const names: string[] = [
"Intel CPU", "AMD CPU",
"Intel Motherboard", "AMD Motherboard", "NVIDIA Motherboard",
"NVIDIA GPU", "GIGABYTE GPU", "Asus GPU", "AMD GPU", "MSI GPU",
"Corsair Memory", "Patriot Memory", "Skill Memory",
"Samsung HDD", "WD HDD", "Seagate HDD", "Intel HDD",
"Samsung SSD", "WD SSD", "Seagate SSD", "Intel SSD",
"Samsung Monitor", "Asus Monitor", "LG Monitor", "HP Monitor" ];
const countries: string[] = ["USA", "UK", "France", "Canada", "Poland", "Japan", "Germany"];
const status: string[] = ["Packing", "Shipped", "Delivered"];
const sales: any[] = [];
for (let i = 0; i < count; i++) {
const price = this.getRandomNumber(100, 900);
const items = this.getRandomNumber(10, 80);
const value = price * items;
const margin = this.getRandomNumber(3, 10);
const profit = Math.round((price * margin / 100) * items);
const country = this.getRandomItem(countries);
sales.push({
BundlePrice: price,
ProductPrice: price,
Margin: margin,
OrderDate: this.getRandomDate(new Date(2012, 0, 1), new Date()),
OrderItems: items,
OrderValue: value, // Math.round(value / 1000) + "," + Math.round(value % 1000),
ProductID: 1001 + i,
ProductName: this.getRandomItem(names),
Profit: profit,
Countries: country,
CountryFlag: this.getCountryFlag(country),
Status: this.getRandomItem(status)
});
}
return sales;
}
public static getHouses(count?: number): any[] {
if (count === undefined) {
count = 250;
}
const houses: any[] = [];
const property: string[] = [ "Townhouse", "Single", "Condo", "Villa"];
const emails: string[] = [ "estates.com", "remax.com", "zillow.com", "realtor.com", "coldwell.com"];
const countries: string[] = ["USA", "UK", "France", "Canada", "Poland", "Japan", "Germany"];
for (let i = 0; i < count; i++) {
const year: number = this.getRandomNumber(1950, 2015);
const age: number = 2020 - year;
const gender: string = this.getRandomGender();
const firstName: string = this.getRandomNameFirst(gender);
const lastName: string = this.getRandomNameLast();
const initials = firstName.substr(0, 1).toLowerCase();
const email: string = initials + lastName.toLowerCase() + "@" + this.getRandomItem(emails);
const street: string = this.getRandomStreet();
const country: string = this.getRandomItem(countries);
const city: string = this.getRandomCity(country);
houses.push({
Address: street + "," + city,
Age: age,
Agent: firstName + " " + lastName,
Area: this.getRandomNumber(50, 300),
Baths: this.getRandomNumber(1, 3),
Built: year,
City: city,
Country: country,
CountryFlag: this.getCountryFlag(country),
Email: email,
ID: this.pad(i + 1, 5),
Phone: this.getRandomPhone(),
Price: this.getRandomNumber(210, 900) * 1000,
Property: this.getRandomItem(property),
Rooms: this.getRandomNumber(2, 5),
SaleDate: this.getRandomDate(new Date(2015, 0, 1), new Date()),
Street: street,
});
}
return houses;
}
private static websites: string[] = [ ".com", ".gov", ".edu", ".org"];
private static emails: string[] = [ "gmail.com", "yahoo.com", "twitter.com"];
private static genders: string[] = ["male", "female"];
private static maleNames: string[] = ["Kyle", "Oscar", "Ralph", "Mike", "Bill", "Frank", "Howard", "Jack", "Larry", "Pete", "Steve", "Vince", "Mark", "Alex", "Max", "Brian", "Chris", "Andrew", "Martin", "Mike", "Steve", "Glenn", "Bruce"];
private static femaleNames: string[] = ["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"];
private static lastNames: string[] = ["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"];
private static countries: string[] = ["USA", "UK", "France", "Canada", "Poland"];
private static citiesUS: string[] = ["New York", "Los Angeles", "Miami", "San Francisco", "San Diego", "Las Vegas"];
private static citiesUK: string[] = ["London", "Liverpool", "Manchester"];
private static citiesFR: string[] = ["Paris", "Marseille", "Lyon"];
private static citiesCA: string[] = ["Toronto", "Vancouver", "Montreal"];
private static citiesPL: string[] = ["Krakow", "Warsaw", "Wroclaw", "Gdansk"];
private static citiesJP: string[] = ["Tokyo", "Osaka", "Kyoto", "Yokohama"];
private static citiesGR: string[] = ["Berlin", "Bonn", "Cologne", "Munich", "Hamburg"];
private static roadSuffixes: string[] = ["Road", "Street", "Way"];
private static roadNames: string[] = ["Main", "Garden", "Broad", "Oak", "Cedar", "Park", "Pine", "Elm", "Market", "Hill"];
private static getRandomNumber(min: number, max: number): number {
return Math.round(min + Math.random() * (max - min));
}
private static getRandomItem(array: any[]): any {
const index = Math.round(this.getRandomNumber(0, array.length - 1));
return array[index];
}
private static getRandomDate(start: Date, end: Date): Date {
return new Date(start.getTime() + Math.random() * (end.getTime() - start.getTime()));
}
private static getRandomPhone(): string {
const phoneCode = this.getRandomNumber(100, 900);
const phoneNum1 = this.getRandomNumber(100, 900);
const phoneNum2 = this.getRandomNumber(1000, 9000);
const phone = phoneCode + "-" + phoneNum1 + "-" + phoneNum2;
return phone;
}
private static getRandomGender(): string {
return this.getRandomItem(this.genders);
}
private static getRandomNameLast(): string {
return this.getRandomItem(this.lastNames);
}
private static getRandomNameFirst(gender: string): string {
if (gender === "male") {
return this.getRandomItem(this.maleNames);
}
else {
return this.getRandomItem(this.femaleNames);
}
}
private static getRandomCity(country: string): string {
if (country === "Canada") {
return this.getRandomItem(this.citiesCA);
} else if (country === "France") {
return this.getRandomItem(this.citiesFR);
} else if (country === "Poland") {
return this.getRandomItem(this.citiesPL);
} else if (country === "USA") {
return this.getRandomItem(this.citiesUS);
} else if (country === "Japan") {
return this.getRandomItem(this.citiesJP);
} else if (country === "Germany") {
return this.getRandomItem(this.citiesGR);
} else { // if (country === "United Kingdom") {
return this.getRandomItem(this.citiesUK);
}
}
private static getRandomStreet(): string {
const num = Math.round(this.getRandomNumber(100, 300)).toString();
const road = this.getRandomItem(this.roadNames);
const suffix = this.getRandomItem(this.roadSuffixes);
return num + " " + road + " " + suffix;
}
private static getBirthday(age: number): Date {
const today: Date = new Date();
const year: number = today.getFullYear() - age;
const month: number = this.getRandomNumber(0, 8);
const day: number = this.getRandomNumber(10, 27);
return new Date(year, month, day);
}
private static getPhotoMale(id: number): string {
return 'https://static.infragistics.com/xplatform/images/people//GUY' + this.pad(id, 2) + '.png';
}
private static getPhotoFemale(id: number): string {
return 'https://static.infragistics.com/xplatform/images/people/GIRL' + this.pad(id, 2) + '.png';
}
private static getGenderPhoto(gender: string): string {
return 'https://static.infragistics.com/xplatform/images/genders/' + gender + '.png';
}
private static getCountryFlag(country: string): string {
return 'https://static.infragistics.com/xplatform/images/flags/' + country + '.png';
}
private static pad(num: number, size: number): string{
let s = num + "";
while (s.length < size) {
s = "0" + s;
}
return s;
}
}
tsimport React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import { DataGridSharedData } from './DataGridSharedData';
import { IgrDataGrid } from "@infragistics/igniteui-react-data-grids";
import { IgrDataGridModule } from "@infragistics/igniteui-react-data-grids";
import { IgrTextColumn } from "@infragistics/igniteui-react-data-grids";
import { IgrNumericColumn } from "@infragistics/igniteui-react-data-grids";
import { IgrDateTimeColumn } from "@infragistics/igniteui-react-data-grids";
import { IgrGridColumnOptionsModule } from "@infragistics/igniteui-react-data-grids";
import { EnterKeyBehaviors } from "@infragistics/igniteui-react-data-grids";
import { EnterKeyBehaviorAfterEdit } from "@infragistics/igniteui-react-data-grids";
import { EditModeType } from "@infragistics/igniteui-react-data-grids";
IgrDataGridModule.register();
IgrGridColumnOptionsModule.register();
export default class DataGridCellActivation extends React.Component<any, any> {
public data: any[];
public grid: IgrDataGrid;
public canMoveAfterEdit: boolean;
public canEdit: EditModeType;
constructor(props: any) {
super(props);
this.state = {
canMoveAfterEdit: true,
enterBehavior: EnterKeyBehaviors.Edit,
enterBehaviorAfterEdit: EnterKeyBehaviorAfterEdit.MoveDown,
canEdit: EditModeType.Cell
};
this.data = DataGridSharedData.getEmployees();
}
public render(): JSX.Element {
return (
<div className="container sample">
<div className="options">
<label className="options-label">Enter Key Mode: </label>
<select className="options-select" value={this.state.enterBehavior}
onChange={this.onEnterKeyModeChange}>
<option>Edit</option>
<option>MoveUp</option>
<option>MoveDown</option>
<option>MoveLeft</option>
<option>MoveRight</option>
<option>None</option>
</select>
<label className="options-label">Enter Key After Edit Mode: </label>
<select className="options-select" disabled={!this.state.canMoveAfterEdit} id="enterAfterEditMode"
value={this.state.enterBehaviorAfterEdit}
onChange={this.onEnterKeyAfterEditModeChange}>
<option>MoveDown</option>
<option>MoveUp</option>
<option>MoveLeft</option>
<option>MoveRight</option>
<option>None</option>
</select>
</div>
<IgrDataGrid
height="100%"
width="100%"
defaultColumnMinWidth={100}
autoGenerateColumns={false}
dataSource={this.data}
enterBehavior={this.state.enterBehavior}
enterBehaviorAfterEdit={this.state.enterBehaviorAfterEdit}
editMode={this.state.canEdit}
selectionMode="SingleCell"
activationMode="Cell"
isColumnOptionsEnabled="true">
<IgrTextColumn field="Name" width="*>170"/>
<IgrTextColumn field="Street" headerText="Address" width="*>150" />
<IgrTextColumn field="City" width="*>130"/>
<IgrNumericColumn field="Salary" width="*>130" positivePrefix="$" showGroupingSeparator="true" />
<IgrDateTimeColumn field="Birthday" width="*>150" />
</IgrDataGrid>
</div>
);
}
public onGridRef = (grid: IgrDataGrid) => {
if (!grid) { return; }
this.grid = grid;
}
public onEnterKeyModeChange = (e: any) => {
if(e.target.value !== "Edit"){
this.setState({ canMoveAfterEdit: false, canEdit:EditModeType.None, enterBehavior: e.target.value, enterBehaviorAfterEdit:EnterKeyBehaviorAfterEdit.None });
}
else if (e.target.value === "Edit") {
this.setState({ canMoveAfterEdit: true, canEdit:EditModeType.Cell, enterBehavior: e.target.value, enterBehaviorAfterEdit:EnterKeyBehaviorAfterEdit.MoveDown });
}
}
public onEnterKeyAfterEditModeChange = (e: any) => {
this.setState({ enterBehavior: EnterKeyBehaviors.Edit, enterBehaviorAfterEdit: e.target.value });
}
}
// rendering above class to the React DOM
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<DataGridCellActivation/>);
tsx
이 샘플이 마음에 드시나요? Ignite UI for React 전체에 액세스하고 몇 분 만에 나만의 앱을 빌드하기 시작하세요. 무료로 다운로드하세요.
Excel 스타일 탐색
enterBehaviorAfterEdit
속성은 편집 모드에서 Enter 키를 누른 후 위, 아래, 왼쪽 또는 오른쪽으로 다음 셀로 이동하도록 그리드를 구성합니다. 그렇지 않으면 편집 모드가 아닌 위, 아래, 왼쪽 또는 오른쪽에서 그리드의 enterBehavior
속성을 사용하여 다른 셀로 이동할 수 있습니다.
키보드 탐색
그리드의 activationMode
속성을 Cell
로 설정하면 데이터 그리드에서 다양한 키보드 탐색 옵션이 활성화됩니다. 다음은 각 키 누르기/조합에 대한 설명과 현재 활성화된 셀과 관련된 효과입니다.
- ↑: 한 셀 위로 이동합니다.
- ↓: 한 셀 아래로 이동합니다.
- ←: 현재 행에서만 한 셀을 왼쪽으로 이동합니다.
- →: 현재 행에서만 한 셀을 오른쪽으로 이동합니다.
- Page Up: 그리드를 한 뷰포트 페이지 위로 스크롤합니다.
- Page Down: 그리드를 한 뷰포트 페이지 아래로 스크롤합니다.
- Tab: 활성 셀을 오른쪽의 다음 셀로 이동하거나 해당 행의 마지막 셀에 도달한 경우 다음 행의 가장 왼쪽 셀로 이동합니다.
- Shift + Tab: 활성 셀을 왼쪽의 다음 셀로 이동하거나 해당 행의 첫 번째 셀에 도달한 경우 이전 행의 가장 오른쪽 셀로 이동합니다.
- Ctrl + ↑: 열의 맨 위 셀로 이동합니다.
- Ctrl + ↓: 열의 맨 아래 셀로 이동합니다.
- Ctrl + ←: 행의 가장 왼쪽 셀로 이동합니다.
- Ctrl + →: 행의 가장 오른쪽 셀로 이동합니다.
- Ctrl + Home: 그리드의 왼쪽 상단 셀로 이동합니다.
- Ctrl + End: 그리드의 오른쪽 하단 셀로 이동합니다.