# 动态表单插件 — C#（AbstractDynamicFormPlugIn）

```csharp
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.DynamicForm.PlugIn.ControlModel;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Core.Metadata.FieldElement;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Util;
using Kingdee.BOS.App.Data;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;

namespace Kingdee.MyProject.Plugin.Form
{
    [Description("动态表单插件说明"), HotUpdate]
    public class MyDynamicFormPlugin : AbstractDynamicFormPlugIn
    {
        public override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            // 动态表单页面加载
            // 读取打开参数
            string tableName = Convert.ToString(this.View.OpenParameter.GetCustomParameter("tableName"));
            if (string.IsNullOrEmpty(tableName)) return;

            // SQL 取数灌分录
            string sql = "/*dialect*/ SELECT * FROM T_MYTABLE";
            var datas = DBUtils.ExecuteDynamicObject(this.Context, sql);
            this.View.Model.DeleteEntryData("F_TTBO_Entity");
            this.View.UpdateView("F_TTBO_Entity");

            int index = 0;
            List<KeyValuePair<int, string>> backColors = new List<KeyValuePair<int, string>>();
            foreach (var item in datas)
            {
                this.View.Model.CreateNewEntryRow("F_TTBO_Entity");
                this.View.Model.SetValue("F_TTBO_Code", item["FCODE"], index);
                this.View.Model.SetValue("F_TTBO_Name", item["FNAME"], index);
                index++;
            }
            // 设置分录行背景色
            var grid = this.View.GetControl<EntryGrid>("F_TTBO_Entity");
            grid.SetRowBackcolor(backColors);
            this.View.UpdateView("F_TTBO_Entity");
        }

        public override void ButtonClick(ButtonClickEventArgs e)
        {
            base.ButtonClick(e);
            string key = e.Key;
            if (key.EqualsIgnoreCase("F_TTBO_BtnRead"))
            {
                DynamicObject obj = this.View.Model.GetValue("F_TTBO_DataField") as DynamicObject;
                if (obj == null)
                {
                    this.View.ShowErrMessage("不能为空");
                    return;
                }
                // 调用自定义控件方法
                // this.View.GetControl("F_TTBO_CustomControl").InvokeControlMethod("DoMethod", "Init", args);
            }
            else if (key.EqualsIgnoreCase("F_TTBO_BtnClose"))
            {
                this.View.ReturnToParentWindow("返回值");
                this.View.Close();
            }
        }

        public override void EntityRowDoubleClick(EntityRowClickEventArgs e)
        {
            base.EntityRowDoubleClick(e);
            string entityKey = e.Key;
            int row = e.Row;
            string fldKey = e.ColKey;
            // 获取该行数据
            DynamicObject rowData = this.View.Model.GetEntityDataObject(entityKey, row);
        }

        public override void DataChanged(DataChangedEventArgs e)
        {
            base.DataChanged(e);
            if (e.Field == null) return;
            // 值更新处理
        }

        public override void BeforeClose(BeforeCloseEventArgs e)
        {
            base.BeforeClose(e);
            // 关闭前确认
        }
    }
}
```

**AbstractDynamicFormPlugIn 全部事件：** 同 AbstractBillPlugIn 事件减去 Bill 专有事件（BeforeSave / BeforeSubmit / AfterSubmit / CopyData / LoadData 等）。核心事件：**OnLoad / AfterBindData / DataChanged / BarItemClick / EntryBarItemClick / ButtonClick / EntryButtonCellClick / BeforeF7Select / BeforeDoOperation / AfterDoOperation / BeforeClosed / EntityRowClick / EntityRowDoubleClick / AfterDeleteRow / BeforeDeleteRow / AfterCreateModelData / AfterCreateNewEntryRow**（完整列表见 FormPlugin.md 的 AbstractDynamicFormPlugIn 继承节）

**源码参考：** `lf-project/Kingdee.LF.Plugin/Plugin/Form/` — TickerHanleBillPlugin.cs, MachineDataReaderFormPlugin.cs, SimilarColorFormPlugin.cs
