public void dgvWorkTypes_CellEndEdit(object sender, DataGridViewCellEventArgs e)
 {
     if (dgv.Columns[e.ColumnIndex].GetType() == typeof(ExtendedDataGridViewComboBoxColumn))
     {
         ExtendedDataGridViewComboBoxColumn dgvcbc = (ExtendedDataGridViewComboBoxColumn)dgv.Columns[e.ColumnIndex];
         if (dgv.Rows[e.RowIndex].Cells[dgvcbc.Name].Value == null)
         {
             return;
         }
     }
     AppDatabase.database.Update((T)bindingSource[e.RowIndex]);
 }
        public DataGridViewEvents(DataGridView control)
        {
            dgv = control;
            string HeaderText;
            var    query = AppDatabase.database.Table <T>();

            foreach (var stock in query)
            {
                bindingSource.Add(stock);
            }

            dgv.AutoGenerateColumns = false;
            //dgv.AutoSize = true;
            dgv.DataSource        = bindingSource;
            dgv.CellContentClick += dgvWorkTypes_CellContentClick;
            dgv.CellEndEdit      += dgvWorkTypes_CellEndEdit;
            dgv.DataError        += Dgv_DataError;
            PropertyInfo[] properties = typeof(T).GetProperties();
            foreach (PropertyInfo property in properties)
            {
                if (new List <string> {
                    "id",
                    "_id",
                    "_name"
                }.Contains(property.Name))
                {
                    continue;
                }
                object[] attrs = property.GetCustomAttributes(true);
                HeaderText = getDisplayName(property.Name, attrs);
                if (property.PropertyType.IsEnum)
                {
                    DataGridViewComboBoxColumn combo = new DataGridViewComboBoxColumn
                    {
                        DataSource = Enum.GetValues(property.PropertyType)
                                     .Cast <Enum>()
                                     .Select(value => new
                        {
                            (Attribute.GetCustomAttribute(value.GetType().GetField(value.ToString()), typeof(DescriptionAttribute)) as DescriptionAttribute).Description,
                            value
                        })
                                     .OrderBy(item => item.value)
                                     .ToList(),
                        DataPropertyName = property.Name,
                        HeaderText       = HeaderText,
                        DisplayMember    = "Description",
                        ValueMember      = "value"
                    };
                    dgv.Columns.Add(combo);
                }
                else if (property.PropertyType.IsPrimitive && isDBColumnAttribute(attrs))
                {
                    DBColumnAttribute tblName = getDBColumnAttribute(attrs);
                    HeaderText = getDisplayName(property.Name, attrs);

                    TableMapping map = new TableMapping(tblName.tableType);

                    //thanks to https://answers.unity.com/questions/841093/passing-type-variable-to-generic-type-variable-not.html
                    MethodInfo genericFunction = AppDatabase.database.GetType().GetMethod("Table");
                    MethodInfo realFunction    = genericFunction.MakeGenericMethod(tblName.tableType);
                    dynamic    query2          = realFunction.Invoke(AppDatabase.database, new object[] { });

                    List <BaseModel> items = new List <BaseModel>();
                    foreach (BaseModel stock in query2)
                    {
                        var x = Activator.CreateInstance(tblName.tableType);
                        x = stock;
                        items.Add((BaseModel)x);
                    }

                    DataGridViewComboBoxColumn combo = new ExtendedDataGridViewComboBoxColumn
                    {
                        DataSource       = items,
                        propertyName     = property.Name,
                        HeaderText       = HeaderText,
                        DisplayMember    = "_name",
                        ValueMember      = "_id",
                        ValueType        = typeof(int),
                        DataPropertyName = property.Name,
                    };
                    dgv.Columns.Add(combo);
                }
                else if (property.PropertyType.IsPrimitive)
                {
                    DataGridViewTextBoxColumn column = new DataGridViewTextBoxColumn
                    {
                        DataPropertyName = property.Name,
                        HeaderText       = HeaderText,
                        ValueType        = property.GetType(),
                    };
                    dgv.Columns.Add(column);
                }
                else if (property.PropertyType == typeof(string))
                {
                    DataGridViewTextBoxColumn combo = new DataGridViewTextBoxColumn
                    {
                        HeaderText       = HeaderText,
                        ValueType        = typeof(string),
                        DataPropertyName = property.Name,
                    };
                    dgv.Columns.Add(combo);
                }
                else if (property.PropertyType == typeof(DateTime))
                {
                    DataGridViewTextBoxColumn combo = new DataGridViewTextBoxColumn
                    {
                        HeaderText       = HeaderText,
                        ValueType        = typeof(DateTime),
                        DataPropertyName = property.Name,
                    };
                    combo.DefaultCellStyle.Format = "MM/dd/yyyy";
                    dgv.Columns.Add(combo);
                }
            }

            DataGridViewButtonColumn btnColumn = new DataGridViewButtonColumn
            {
                HeaderText = "حذف",
                Text       = "حذف",
                UseColumnTextForButtonValue = true
            };

            dgv.Columns.Add(btnColumn);
        }