فیتلر کردن ComboBox یک ستون بر اساس ComboBox ستون دیگر در DataGridView

برای فیتلر کردن ComboBox یک ستون بر اساس ComboBox ستون دیگر در DataGridView می توان به صورت زیر عمل کرد :

using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace FilterComboBasedOnAnotherDGV
{
    public partial class Form1 : Form
    {
        private Dictionary<Family, List<Child>> dataSource = null;

        public Form1()
        {
            InitializeComponent();

            this.InitializeDataSource();
            this.InitializeDatagridview();
        }

        private void InitializeDataSource()
        {
            List<Child> childs1 = new List<Child>()
            {
                new Child() {Id = 1,Name = "Jack" },
                new Child() {Id = 2, Name = "John" },
                new Child() {Id = 3, Name = "Jason" },
            };

            List<Child> childs2 = new List<Child>()
            {
                new Child() {Id = 1, Name = "Roze" }
            };

            this.dataSource = new Dictionary<Family, List<Child>>();
            this.dataSource.Add(new Family() { Id = 1, Name = "FirstFamily" }, childs1);
            this.dataSource.Add(new Family() { Id = 2, Name = "SecondFamily" }, childs2);
        }
        private void InitializeDatagridview()
        {
            this.dataGridView1.AutoGenerateColumns = false;
            this.dataGridView1.EditingControlShowing += DataGridView1_EditingControlShowing;

            DataGridViewComboBoxColumn familyCombo = new DataGridViewComboBoxColumn();
            familyCombo.Name = "family";
            familyCombo.HeaderText = "Family";
            familyCombo.DisplayMember = "Name";
            familyCombo.ValueMember = "Id";
            foreach (Family family in this.dataSource.Keys)
            {
                familyCombo.Items.Add(family);
            }

            DataGridViewComboBoxColumn childCombo = new DataGridViewComboBoxColumn();
            childCombo.Name = "child";
            childCombo.HeaderText = "Child";
            childCombo.ValueMember = "ID";
            childCombo.DisplayMember = "Name";

            this.dataGridView1.Columns.Add(familyCombo);
            this.dataGridView1.Columns.Add(childCombo);

            this.dataGridView1.Rows.Add();
        }

        private void DataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
        {
            if (dataGridView1.CurrentCell.ColumnIndex == dataGridView1.Columns["family"].Index)
            {
                ComboBox familyBox = e.Control as ComboBox;
                familyBox.SelectedIndexChanged += familyBox_SelectedIndexChanged;
            }
        }

        private void familyBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            ComboBox box = sender as ComboBox;

            DataGridViewComboBoxCell childCell = dataGridView1.Rows[dataGridView1.CurrentCell.RowIndex].Cells[dataGridView1.Columns["child"].Index] as DataGridViewComboBoxCell;
            childCell.Items.Clear();
            foreach (Child child in this.dataSource[box.SelectedItem as Family])
            {
                childCell.Items.Add(child);
            }

            if (childCell.Items.Count > 0)
            {
                childCell.Value = childCell.Items[0];
            }
            box.SelectedIndexChanged -= familyBox_SelectedIndexChanged;
        }

        private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
        {
            if (this.dataGridView1.CurrentCell is DataGridViewComboBoxCell)
            {
                dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
                dataGridView1.EndEdit();
            }
        }
    }
}

Filter datagridview combobox column based on another combobox-c#-01
Filter datagridview combobox column based on another combobox-c#-02