作成日: 2021/07/07 最終更新日: 2021/07/28
文書種別
不具合
状況
修正済み
詳細
コンボボックスセルのドロップダウンリストの項目数が多い場合(約10000以上)、行の移動が遅くなります。
回避方法
この問題はService Pack 6(v10.0.4006.2012)で修正されました。
不具合を修正した最新のサービスパックは、アップデートページ からダウンロードできます。
Service Pack 6 未適用のときは以下の回避方法をご検討ください。
MultiRowに設定されたデータ上での検索処理をするのではなく、CellFormattingイベントをオーバーライドしデータテーブル上で検索を実行することで動作の改善が可能です。
〇サンプルコード(VB.NET)
Private dt As New DataTable() Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load ' コンボボックス用データの作成 dt.Columns.AddRange({New DataColumn("Code"), New DataColumn("Name")}) For i = 0 To 15999 dt.Rows.Add($"{i + 1:00000}", $"Item{i}") Next dt.AcceptChanges() ' セル型の作成 Dim comboCell As New ComboBoxCell() With { .Name = "comboCell", .DataSource = dt, .ValueMember = "Code", .DisplayMember = "Name" } Dim textCell As New TextBoxCell() With { .Name = "textCell" } ' テンプレートの作成 Dim template1 As Template = Template.CreateGridTemplate({comboCell, textCell}) ' MultiRowの設定 GcMultiRow1.Template = template1 GcMultiRow1.RowCount = 1000 For i = 0 To GcMultiRow1.RowCount - 1 GcMultiRow1.SetValue(i, 0, $"{i + 1:00000}") GcMultiRow1.SetValue(i, 1, $"B{i}") Next End Sub Private Sub GcMultiRow1_CellFormatting(sender As Object, e As CellFormattingEventArgs) Handles GcMultiRow1.CellFormatting Dim formattedValue As String = "" If e.CellIndex = 0 AndAlso e.Value IsNot Nothing AndAlso GetValue(dt, e.Value.ToString(), formattedValue) Then e.Value = formattedValue e.FormattingApplied = True End If End Sub Private Function GetValue(dt As DataTable, value As String, ByRef formattedValue As String) As Boolean For i As Integer = 0 To dt.Rows.Count - 1 If dt.Rows(i)("Code").ToString() = value Then formattedValue = dt.Rows(i)("Name").ToString() Return True End If Next Return False End Function
〇サンプルコード(C#)
public partial class Form1 : Form { public Form1() { InitializeComponent(); gcMultiRow1.CellFormatting += gcMultiRow1_CellFormatting; } DataTable dt = new DataTable(); private void Form1_Load(object sender, EventArgs e) { // コンボボックス用データの作成 dt.Columns.AddRange(new DataColumn[] { new DataColumn("Code"), new DataColumn("Name") }); for (var i = 0; i < 15999; i++) { dt.Rows.Add($"{i + 1:00000}", $"Item{i}"); } dt.AcceptChanges(); // セル型の作成 ComboBoxCell comboCell = new ComboBoxCell(); comboCell.Name = "comboCell"; comboCell.DataSource = dt; comboCell.ValueMember = "Code"; comboCell.DisplayMember = "Name"; TextBoxCell textCell = new TextBoxCell(); textCell.Name = "textCell"; // テンプレートの作成 Template template1 = Template.CreateGridTemplate(new Cell[] { comboCell, textCell }); // MultiRowの設定 gcMultiRow1.Template = template1; gcMultiRow1.RowCount = 1000; for(var i = 0; i < gcMultiRow1.RowCount; i++) { gcMultiRow1.SetValue(i, 0, $"{i + 1:00000}"); gcMultiRow1.SetValue(i, 1, $"B{i}"); } } private void gcMultiRow1_CellFormatting(Object sender , CellFormattingEventArgs e) { string formattedValue = ""; if(e.CellIndex == 0 && e.Value != null && GetValue(dt, e.Value.ToString(), ref formattedValue)) { e.Value = formattedValue; e.FormattingApplied = true; } } private Boolean GetValue(DataTable dt, string value, ref string formattedValue) { for (var i = 0; i < dt.Rows.Count; i++) { if (dt.Rows[i]["Code"].ToString() == value) { formattedValue = dt.Rows[i]["Name"].ToString(); return true; } } return false; } }