PowerTools MultiRow for Windows Forms 8.0J
VirtualMode プロパティ
使用例 

ユーザーがGcMultiRowコントロールに独自のデータ管理操作を提供しているかどうかを示す値を取得または設定します。
構文
Public Property VirtualMode As Boolean
public bool VirtualMode {get; set;}

プロパティ値

GcMultiRowで、ユーザーが提供したデータ管理操作が使用されるようにする場合はtrue。それ以外の場合はfalse。既定値はfalseです。
解説

仮想モードは、大量のデータを取り扱う場合を想定して設計されています。VirtualModeプロパティがtrueの場合は、一定の行数のGcMultiRowを作成してから、CellValueNeededイベントを処理してセルにデータを格納します。仮想モードを使用するには、ユーザーの操作に基づいてGcMultiRowのセルのデータ格納、編集、および削除を処理するために、基になるデータキャッシュの実装が必要となります。

仮想モードを適切に実装すると、GcMultiRowへのデータアクセスのパフォーマンスが向上します。

仮想モードに関連するイベントを次の表に示します。

イベント 説明
CellValueNeeded コントロールがセルの描画を必要とするたび、またはその他のアクションによってセル値の取得が必要とされるたびに、このイベントがコントロールによって生成され、データストアの値が要求されます。ユーザーはこのイベントを処理し、CellEventArgs.SectionIndex(またはCellEventArgs.RowIndex)、CellEventArgs.CellIndex(またはCellEventArgs.CellName)、およびCellEventArgs.Scopeに基づいて、データストアに対応する特定の値をCellValueEventArgs.Valueプロパティに設定する必要があります。
CellValuePushed ユーザーがセル値を編集してコミットすると、このイベントがコントロールによって生成され、特定のセルの値が変更されたことを通知します。ユーザーはこのイベントを処理してデータストアを更新する必要があります。新しい値の情報はCellValueEventArgs.Valueプロパティに含まれます。編集されたセルを特定するには、CellValueEventArgsCellEventArgs.SectionIndex(またはCellEventArgs.RowIndex)、CellEventArgs.CellIndex(またはCellEventArgs.CellName)、およびCellEventArgs.Scopeの値を取得します。
NewRowNeeded このイベントはオプションです。このイベントは、(データベースのように)コミットされていない新しい行がアクティブになったときに値を自動生成する場合にのみ、処理する必要があります。このような場合は、このイベントを処理し、RowEventArgsRowEventArgs.Rowのセルの値を変更します。

CancelRowEdit

および

RowDirtyStateNeeded

これら2つのイベントもオプションです。これら2つのイベントは、行レベルのコミットを実装する場合にのみ処理する必要があります。ユーザーが[Esc]キーを押して現在の行のまだコミットされていない編集をキャンセルすると、CancelRowEditイベントがコントロールによって生成され、データストアの値の復元が必要であることを通知します。RowDirtyStateNeededは、現在のIsCurrentRowDirtyプロパティの値を決定するために処理します。CancelRowEditは、このプロパティの値がtrueの場合にのみ発生します。

GcMultiRowがデータバインディングモードのとき、このプロパティは無効です。

使用例
次のサンプルコードは、仮想モード時のデータの管理方法を示します。ここでは、各種イベントを処理することによって行の編集、追加、削除、および行レベルのキャンセルを実装しています。
using System;
using System.Windows.Forms;
using System.Collections.Generic;

namespace GrapeCity.Win.MultiRow.SampleCode
{
    public class VirtualModeDemo : Form
    {
        private GcMultiRow gcMultiRow1 = new GcMultiRow();
        private List<Student> userData = new List<Student>();
        private Student uncommitNewStudent = null;
        private Student restoreRow = null;

        public VirtualModeDemo()
        {
            this.Text = "VirtualMode Demo";

            // Add MultiRow to form
            this.gcMultiRow1.Dock = DockStyle.Fill;
            this.Controls.Add(this.gcMultiRow1);

            this.InitializeTemplate();

            this.InitializeData();

            this.Load += new EventHandler(Form1_Load);
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // Set virtual mode event, you can manage date by you self by CellValueNeeded,CellValuePushed etc. events.
            gcMultiRow1.VirtualMode = true;
            gcMultiRow1.CellValueNeeded += new EventHandler<CellValueEventArgs>(gcMultiRow1_CellValueNeeded);
            gcMultiRow1.CellValuePushed += new EventHandler<CellValueEventArgs>(gcMultiRow1_CellValuePushed);
            gcMultiRow1.CancelRowEdit += new EventHandler<QuestionEventArgs>(gcMultiRow1_CancelRowEdit);
            gcMultiRow1.NewRowNeeded += new EventHandler<RowEventArgs>(gcMultiRow1_NewRowNeeded);
            gcMultiRow1.RowEnter += new EventHandler<CellEventArgs>(gcMultiRow1_RowEnter);
            gcMultiRow1.RowsAdded += new EventHandler<RowsAddedEventArgs>(gcMultiRow1_RowsAdded);
            gcMultiRow1.RowsRemoved += new EventHandler<RowsRemovedEventArgs>(gcMultiRow1_RowsRemoved);
        }

        void gcMultiRow1_CellValuePushed(object sender, CellValueEventArgs e)
        {
            // When user edit value, MultiRow control will notify update your data by this event.
            Student student = userData[e.RowIndex];

            if (e.CellName == "Name")
            {
                student.Name = e.Value.ToString();
            }
            else
            {
                int value;

                if (!int.TryParse(e.Value.ToString(), out value))
                {
                    MessageBox.Show("Score should be a number");
                    return;
                }

                if (e.CellName == "Mathematics")
                {
                    student.MathematicsScore = value;
                }
                else if (e.CellName == "Philosophy")
                {
                    student.PhilosophyScore = value;
                }
            }
        }

        void gcMultiRow1_CellValueNeeded(object sender, CellValueEventArgs e)
        {
            Student student = null;
            if (e.RowIndex == userData.Count)
            {
                student = uncommitNewStudent;
            }
            else
            {
                student = userData[e.RowIndex];
            }

            // When MultiRow control paint a cell, the control will ask the value of the specific cell by this event.
            if (e.CellName == "Name")
            {
                e.Value = student.Name;
            }
            if (e.CellName == "Mathematics")
            {
                e.Value = student.MathematicsScore;
            }
            if (e.CellName == "Philosophy")
            {
                e.Value = student.PhilosophyScore;
            }
            if (e.CellName == "ID")
            {
                e.Value = student.ID;
            }
        }

        void gcMultiRow1_NewRowNeeded(object sender, RowEventArgs e)
        {
            // Add new row when user move current cell to last new row.
            uncommitNewStudent = new Student(userData.Count, null, 0, 0);
        }

        void gcMultiRow1_CancelRowEdit(object sender, QuestionEventArgs e)
        {
            int currentRowIndex = gcMultiRow1.CurrentCellPosition.RowIndex;
            // Cancel uncommitted new row.
            if (currentRowIndex >= 0 && currentRowIndex < gcMultiRow1.RowCount - 1)
            {
                // Cancel row level edit.
                userData[currentRowIndex] = new Student(restoreRow.ID, restoreRow.Name, restoreRow.MathematicsScore, restoreRow.PhilosophyScore);
            }
        }

        void gcMultiRow1_RowsRemoved(object sender, RowsRemovedEventArgs e)
        {
            // When user select rows and press Ctrl+Delete key, the rows romoved.
            // Update user data source.
            userData.RemoveRange(e.RowIndex, e.RowCount);
        }

        void gcMultiRow1_RowsAdded(object sender, RowsAddedEventArgs e)
        {
            // When user add rows, add  uncommitted new row to user data source.
            userData.Add(uncommitNewStudent);
        }

        void gcMultiRow1_RowEnter(object sender, CellEventArgs e)
        {
            if (e.RowIndex != gcMultiRow1.NewRowIndex)
            {
                // When row enter cache old value, if user press ESC key to cancel row level edit value, use this row restore.
                restoreRow = new Student(userData[e.RowIndex].ID, userData[e.RowIndex].Name, userData[e.RowIndex].MathematicsScore, userData[e.RowIndex].PhilosophyScore);
            }
        }

        private void InitializeTemplate()
        {
            // Create a template with 3 text box and a header cell.
            Template template = Template.CreateGridTemplate(3);

            // Initialize column header's caption
            template.ColumnHeaders[0][0].Value = "Name";
            template.ColumnHeaders[0][1].Value = "Mathematics";
            template.ColumnHeaders[0][2].Value = "Philosophy";
            template.ColumnHeaders[0][3].Value = "ID";

            // Initialize cell's Name.
            template.Row.Cells[0].Name = "Name";
            template.Row.Cells[1].Name = "Mathematics";
            template.Row.Cells[2].Name = "Philosophy";
            template.Row.Cells[3].Name = "ID";

            this.gcMultiRow1.Template = template;
        }

        #region Initial user data

        public class Student
        {
            public Student(int id, string name, int mathematicsScore, int philosophyScore)
            {
                ID = id;
                Name = name;
                MathematicsScore = mathematicsScore;
                PhilosophyScore = philosophyScore;
            }

            public int ID;
            public string Name;
            public int MathematicsScore;
            public int PhilosophyScore;
        }

        private void InitializeData()
        {
            userData.Add(new Student(0, "Jim", 100, 100));
            userData.Add(new Student(1, "Tom", 88, 92));
            userData.Add(new Student(2, "Smith", 80, 66));

            // 3 records and a new row.
            this.gcMultiRow1.RowCount = 4;
        }

        #endregion

        [STAThreadAttribute()]
        public static void Main()
        {
            Application.EnableVisualStyles();
            Application.Run(new VirtualModeDemo());
        }
    }
}
Imports System
Imports System.Windows.Forms
Imports GrapeCity.Win.MultiRow

Public Class VirtualModeDemo
    Inherits Form
    Friend WithEvents gcMultiRow1 As New GcMultiRow()
    Private userData As New List(Of Student)()
    Private uncommitNewStudent As Student = Nothing
    Private restoreRow As Student = Nothing

    Public Sub New()
        Me.Text = "VirtualMode Demo"

        ' Add MultiRow to form
        Me.gcMultiRow1.Dock = DockStyle.Fill
        Me.Controls.Add(Me.gcMultiRow1)

        Me.InitializeTemplate()

        Me.InitializeData()
    End Sub

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
        ' Set virtual mode event, you can manage date by you self by CellValueNeeded,CellValuePushed etc. events.
        gcMultiRow1.VirtualMode = True
    End Sub

    Private Sub gcMultiRow1_CellValuePushed(ByVal sender As Object, ByVal e As CellValueEventArgs) Handles gcMultiRow1.CellValuePushed
        ' When user edit value, MultiRow control will notify update your data by this event.
        Dim student As Student = userData(e.RowIndex)

        If e.CellName = "Name" Then
            student.Name = e.Value.ToString()
        Else
            Dim value As Integer

            If Not Integer.TryParse(e.Value.ToString(), value) Then
                MessageBox.Show("Score should be a number")
                Return
            End If

            If e.CellName = "Mathematics" Then
                student.MathematicsScore = value
            ElseIf e.CellName = "Philosophy" Then
                student.PhilosophyScore = value
            End If
        End If
    End Sub

    Private Sub gcMultiRow1_CellValueNeeded(ByVal sender As Object, ByVal e As CellValueEventArgs) Handles gcMultiRow1.CellValueNeeded
        Dim student As Student = Nothing
        If e.RowIndex = userData.Count Then
            student = uncommitNewStudent
        Else
            student = userData(e.RowIndex)
        End If

        ' When MultiRow control paint a cell, the control will ask the value of the specific cell by this event.
        If e.CellName = "Name" Then
            e.Value = student.Name
        End If
        If e.CellName = "Mathematics" Then
            e.Value = student.MathematicsScore
        End If
        If e.CellName = "Philosophy" Then
            e.Value = student.PhilosophyScore
        End If
        If e.CellName = "ID" Then
            e.Value = student.ID
        End If
    End Sub

    Private Sub gcMultiRow1_NewRowNeeded(ByVal sender As Object, ByVal e As RowEventArgs) Handles gcMultiRow1.NewRowNeeded
        ' Add new row when user move current cell to last new row.
        uncommitNewStudent = New Student(userData.Count, Nothing, 0, 0)
    End Sub

    Private Sub gcMultiRow1_CancelRowEdit(ByVal sender As Object, ByVal e As QuestionEventArgs) Handles gcMultiRow1.CancelRowEdit
        Dim currentRowIndex As Integer = gcMultiRow1.CurrentCellPosition.RowIndex
        ' Cancel uncommitted new row.
        If currentRowIndex >= 0 AndAlso currentRowIndex < gcMultiRow1.RowCount - 1 Then
            ' Cancel row level edit.
            userData(currentRowIndex) = New Student(restoreRow.ID, restoreRow.Name, restoreRow.MathematicsScore, restoreRow.PhilosophyScore)
        End If
    End Sub

    Private Sub gcMultiRow1_RowsRemoved(ByVal sender As Object, ByVal e As RowsRemovedEventArgs) Handles gcMultiRow1.RowsRemoved
        ' When user select rows and press Ctrl+Delete key, the rows romoved.
        ' Update user data source.
        userData.RemoveRange(e.RowIndex, e.RowCount)
    End Sub

    Private Sub gcMultiRow1_RowsAdded(ByVal sender As Object, ByVal e As RowsAddedEventArgs) Handles gcMultiRow1.RowsAdded
        ' When user add rows, add  uncommitted new row to user data source.
        If (Not uncommitNewStudent Is Nothing) Then
            userData.Add(uncommitNewStudent)
        End If
    End Sub

    Private Sub gcMultiRow1_RowEnter(ByVal sender As Object, ByVal e As CellEventArgs) Handles gcMultiRow1.RowEnter
        If e.RowIndex <> gcMultiRow1.NewRowIndex Then
            ' When row enter cache old value, if user press ESC key to cancel row level edit value, use this row restore.
            restoreRow = New Student(userData(e.RowIndex).ID, userData(e.RowIndex).Name, userData(e.RowIndex).MathematicsScore, userData(e.RowIndex).PhilosophyScore)
        End If
    End Sub

    Private Sub InitializeTemplate()
        ' Create a template with 3 text box and a header cell.
        Dim template1 As Template = Template.CreateGridTemplate(3)

        ' Initialize column header's caption
        template1.ColumnHeaders(0)(0).Value = "Name"
        template1.ColumnHeaders(0)(1).Value = "Mathematics"
        template1.ColumnHeaders(0)(2).Value = "Philosophy"
        template1.ColumnHeaders(0)(3).Value = "ID"

        ' Initialize cell's Name.
        template1.Row.Cells(0).Name = "Name"
        template1.Row.Cells(1).Name = "Mathematics"
        template1.Row.Cells(2).Name = "Philosophy"
        template1.Row.Cells(3).Name = "ID"

        Me.gcMultiRow1.Template = template1
    End Sub

#Region "Initial user data"

    Public Class Student
        Public Sub New(ByVal id1 As Integer, ByVal name2 As String, ByVal mathematicsScore3 As Integer, ByVal philosophyScore4 As Integer)
            ID = id1
            Name = name2
            MathematicsScore = mathematicsScore3
            PhilosophyScore = philosophyScore4
        End Sub

        Public ID As Integer
        Public Name As String
        Public MathematicsScore As Integer
        Public PhilosophyScore As Integer
    End Class

    Private Sub InitializeData()
        userData.Add(New Student(0, "Jim", 100, 100))
        userData.Add(New Student(1, "Tom", 88, 92))
        userData.Add(New Student(2, "Smith", 80, 66))

        ' 3 records and a new row.
        Me.gcMultiRow1.RowCount = 4
    End Sub

#End Region

    <STAThreadAttribute()> _
    Public Shared Sub Main()
        Application.EnableVisualStyles()
        Application.Run(New VirtualModeDemo())
    End Sub
End Class
参照

GcMultiRow クラス
GcMultiRow メンバ
CellValueNeeded イベント
CellValuePushed イベント
NewRowNeeded イベント
CancelRowEdit イベント
RowDirtyStateNeeded イベント

 

 


© 2008-2015 GrapeCity inc. All rights reserved.