作成日: 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;
}
}