作成日: 2022/02/22 最終更新日: 2022/08/31
文書種別
不具合
状況
修正済み
詳細
C1ComboBoxにおいて、ItemsValueMemberプロパティに設定したDataTableのフィールド値に、重複する値があるとき、重複する値の2番目に出現する項目をドロップダウンから選択した場合、SelectedIndexは最初に出現する項目を示す値になります。
例えば、データテーブルに以下のようなデータを追加した場合を想定します。
C1ComboBoxのItemsValueMemberを"Name"に設定します。
実行して、ドロップダウンの上から4番目の項目("99", "ああ")を選択すると、 SelectedIndexChangedイベント内で取得したC1ComboBox1.SelectedIndexが、"ああ"が最初に出現する項目を示す値("1")になります。
例えば、データテーブルに以下のようなデータを追加した場合を想定します。
DataTable1.Rows.Add("デフォルト", "")
DataTable1.Rows.Add("11", "ああ")
DataTable1.Rows.Add("22, "あああ")
DataTable1.Rows.Add("99", "ああ")
DataTable1.Rows.Add("55", "いい")
DataTable1.Rows.Add("55", "うう")
※最初が"ID"フィールド、2番目が"Name"フィールドC1ComboBoxのItemsValueMemberを"Name"に設定します。
C1ComboBox1.ItemsValueMember = "Name"
実行して、ドロップダウンの上から4番目の項目("99", "ああ")を選択すると、 SelectedIndexChangedイベント内で取得したC1ComboBox1.SelectedIndexが、"ああ"が最初に出現する項目を示す値("1")になります。
回避方法
この問題は2022J v2(4.5.20222.566)で修正されました。
※修正版を適用しない場合の回避方法は以下の通りです。
ユニークな値を持つフィールド(例:"Index")をDataTableに追加し、ItemsValueMemberとしてそのフィールドを指定する方法が考えられます。
◎サンプルコード(VB)
※修正版を適用しない場合の回避方法は以下の通りです。
ユニークな値を持つフィールド(例:"Index")をDataTableに追加し、ItemsValueMemberとしてそのフィールドを指定する方法が考えられます。
◎サンプルコード(VB)
Imports C1.Win.C1Input
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
' データテーブルの設定
Dim DataTable1 As DataTable
DataTable1 = New DataTable
DataTable1.Columns.Add("ID", GetType(System.String))
DataTable1.Columns.Add("Name", GetType(System.String))
DataTable1.Columns.Add("Index", GetType(System.String)) ' ※追加
DataTable1.Rows.Add("デフォルト", "")
DataTable1.Rows.Add("11", "ああ", "1")
DataTable1.Rows.Add("22", "あああ", "2")
DataTable1.Rows.Add("99", "ああ", "3")
DataTable1.Rows.Add("55", "いい", "4")
DataTable1.Rows.Add("55", "うう", "5")
DataTable1.AcceptChanges()
' コンボボックスの設定
C1ComboBox1.Items.Clear()
C1ComboBox1.TextDetached = True
C1ComboBox1.ItemsDataSource = DataTable1
C1ComboBox1.ItemsDisplayMember = "ID"
C1ComboBox1.ItemsValueMember = "Index"
' C1ComboBoxアイテムの複数列表示
C1ComboBox1.ItemMode = ComboItemMode.HtmlPattern
C1ComboBox1.HtmlPattern = "<table><tr><td width=100>{ID}</td><td width=100>{Name}</td></tr></table>"
End Sub
Private Sub C1ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles C1ComboBox1.SelectedIndexChanged
Dim dt As DataTable = C1ComboBox1.ItemsDataSource
TextBox1.Text = C1ComboBox1.SelectedIndex.ToString()
TextBox2.Text = dt.Rows(C1ComboBox1.SelectedIndex)("Name")
TextBox3.Text = C1ComboBox1.Text
End Sub
End Class
◎サンプルコード(C#)
using C1.Win.C1Input;
namespace prj_C1ComboBox
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
// データテーブルの設定
DataTable dataTable1 = new DataTable();
dataTable1.Columns.Add("ID", typeof(System.String));
dataTable1.Columns.Add("Name", typeof(System.String));
dataTable1.Columns.Add("Index", typeof(System.String)); // ※追加
dataTable1.Rows.Add("デフォルト", "");
dataTable1.Rows.Add("11", "ああ", "1");
dataTable1.Rows.Add("22", "あああ", "2");
dataTable1.Rows.Add("99", "ああ", "3");
dataTable1.Rows.Add("55", "いい", "4");
dataTable1.Rows.Add("55", "うう", "5");
dataTable1.AcceptChanges();
// コンボボックスの設定
c1ComboBox1.Items.Clear();
c1ComboBox1.TextDetached = true;
c1ComboBox1.ItemsDataSource = dataTable1;
c1ComboBox1.ItemsDisplayMember = "ID";
c1ComboBox1.ItemsValueMember = "Index";
// C1ComboBoxアイテムの複数列表示
c1ComboBox1.ItemMode = ComboItemMode.HtmlPattern;
c1ComboBox1.HtmlPattern = "<table><tr><td width=100>{ID}</td><td width=100>{Name}</td></tr></table>";
}
private void c1ComboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
DataTable dt = (DataTable)c1ComboBox1.ItemsDataSource;
textBox1.Text = c1ComboBox1.SelectedIndex.ToString();
textBox2.Text = (String)(dt.Rows[c1ComboBox1.SelectedIndex]["Name"]);
textBox3.Text = c1ComboBox1.Text;
}
}
}