[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]
コメント