【解決方法】C#ウィンドウフォームでdatagridviewコンボボックスを埋めるにはどうすればよいですか?

[ad_1]

こんにちは、私の C# Windows フォーム プロジェクトでは、私の datagridview には ComboBox 列が 1 つあります。 このコンボボックスのアイテムはフォームデータベースを読み取り、各行コンボボックスには異なるアイテムがあります。
ただし、すべての Row コンボボックスには常に同じ項目があります。 どうすればこれを修正できますか?
助けてください。
私の現在のコードは次のとおりです。

私が試したこと:

C#
<pre>
private void dataGridFill(IEnumerable<object> list)
        {
            string address = "";
            List<String> categoryName = new List<string>();
            dataGridView1.DataSource = null;
            dataGridView1.RowTemplate.Height = 100;
            BLLCategory bLL = new BLLCategory();
            

            //id Column
            DataGridViewTextBoxColumn idColumn = new DataGridViewTextBoxColumn();
            dataGridView1.Columns.Add(idColumn);
            idColumn.HeaderText = "کد";
            idColumn.Name = "id";
            idColumn.Visible = false;

            // image Column
            DataGridViewImageColumn imageColumn = new DataGridViewImageColumn();
            dataGridView1.Columns.Add(imageColumn);
            imageColumn.HeaderText = "تصویر";
            imageColumn.Name = "image";
            ((DataGridViewImageColumn)dataGridView1.Columns["image"]).ImageLayout = DataGridViewImageCellLayout.Stretch;
            dataGridView1.Columns["image"].Width = 100;
            
            //title Column
            DataGridViewTextBoxColumn titleColumn = new DataGridViewTextBoxColumn();
            dataGridView1.Columns.Add(titleColumn);
            titleColumn.HeaderText = "عنوان";
            titleColumn.Name = "title";
            dataGridView1.Columns["title"].Width = 100;

            //address Column
            DataGridViewTextBoxColumn addressColumn = new DataGridViewTextBoxColumn();
            dataGridView1.Columns.Add(addressColumn);
            addressColumn.HeaderText = "آدرس";
            addressColumn.Name = "Address";
            addressColumn.Visible = false;

            // category coulmn
            DataGridViewComboBoxColumn comboBoxColumn = new DataGridViewComboBoxColumn();
            comboBoxColumn.Name = "Category";
            comboBoxColumn.HeaderText = "دسته‌بندی‌ها";
            dataGridView1.Columns.Add(comboBoxColumn);
      
            


            foreach (var item in list)
            {
               
                categoryName.Clear();
                int index = dataGridView1.Rows.Add();

                dataGridView1.Rows[index].Cells["id"].Value = item.GetType().GetProperty("id").GetValue(item, null).ToString();
                dataGridView1.Rows[index].Cells["image"].Value = (byte[])item.GetType().GetProperty("image").GetValue(item, null);
                dataGridView1.Rows[index].Cells["title"].Value = item.GetType().GetProperty("title").GetValue(item, null);

                address = item.GetType().GetProperty("address").GetValue(item, null).ToString();
                    dataGridView1.Rows[index].Cells["Address"].Value = address;



                foreach (var cat in bLL.GetCategoryName((Guid)item.GetType().GetProperty("id").GetValue(item, null)))
                {
                    categoryName.Add((string)cat.GetType().GetProperty("name").GetValue(cat, null));
                    //dataGridViewX1.Rows[index].Cells["Category"].Value = (string)cat.GetType().GetProperty("name").GetValue(cat, null);
                }
   
                DataGridViewComboBoxCell comboCell = dataGridView1["Category", index] as DataGridViewComboBoxCell; 
                comboCell.DataSource = new BindingSource(categoryName,null);
            }








            //dataGridViewX1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
            dataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.LightBlue;
        }

解決策 1

あなたは宣言しました categoryName リスト あなたのループの。 すべての行は文字列の同じリストにバインドされ、すべての行のカテゴリをその 1 つのリストに追加します。 ループの各反復の開始時にリストをクリアするため、リストには最後の行のカテゴリのみが含まれます。

リスト変数をループ内に移動すると、各行が独自の個別のリストを取得します。

C#
foreach (var item in list)
{
    List<String> categoryName = new List<string>();
    ...

注意: ループ内で多くの高価なリフレクションを行っています。 ほぼ間違いなく、より良いアプローチがあります。 少なくとも、キャッシュする必要があります item.GetType() 変数を呼び出し、複数回読み取ったプロパティの値をキャッシュします。

C#
foreach (var item in list)
{
    Type itemType = item.GetType();
    Guid id = (Guid)itemType.GetProperty("id").GetValue(item, null);
    ...

[ad_2]

コメント

タイトルとURLをコピーしました