⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scaffold.cs

📁 一种.net实现ajax方法的类库
💻 CS
📖 第 1 页 / 共 2 页
字号:
                    sl.DataSource = (IRecordList<C>)root.RecordLists[availableRecordLists[b.Arg].Source];
                    sl.LabelFormat = availableRecordLists[b.Arg].Format;
                    sl.Mode = SelectionMode.Multiple;
                    sl.Init();
                    sl.OnChanged += new EventHandler<SelectItemEventArgs>(sl_OnChanged);
                    sl.DataBind();
                    sl.Record = b.Record;
                    sl.StateBag["RecordList"] = list;
                    b.Parent.Add(sl);
                    b.StateBag["Childwidget"] = sl;
                    foreach (Template t in sl.Items)
                    {
                        if (list.Contains(t.Record as C))
                            t.Widgets.Find<SelectItem>().Selected = true;
                    }
                }
                else
                {
                    Scaffold<C> s = new Scaffold<C>();
                    s.customGridTemplates = this.customGridTemplates;
                    s.Record = b.Record;
                    s.rootScaffold = this.rootScaffold;
                    s.buttonType = this.buttonType;
                    s.ShowNewButton = this.ShowNewButton;
                    s.Model = typeof(C).FullName;
                    s.Id = "_scaffold";
                    if (this.customGridTemplates != null && this.customGridTemplates[s.Model] != null)
                    {
                        s.customGridTemplate = this.customGridTemplates[s.Model] as Pane;
                    }
                    s.DataSource = list;
                    s.Init();
                    b.Parent.Add(s);
                    b.StateBag["Childwidget"] = s;
                }
			}
			else
			{
				b.Label = b.Label.Replace("Hide", "Show");
                childwidget.Visible = false;
			}
		}

        void sl_OnChanged(object sender, SelectItemEventArgs e)
        {
            Widget c = sender as Widget;
            object childRecords = c.StateBag["RecordList"];
            Type listType = childRecords.GetType();
            if (e.Selected)
            {
                listType.InvokeMember(
                    "Add",
                    BindingFlags.InvokeMethod, 
                    null, 
                    childRecords, 
                    new object[] { e.Item.Record });
            }
            else
            {
                listType.InvokeMember(
                    "Remove",
                    BindingFlags.InvokeMethod, 
                    null, 
                    childRecords, 
                    new object[] { e.Item.Record });
            }
            c.Parent.Record.Save();
        }

		private void insertEditAndDeleteButtons( Pane pane )
		{
			PlaceHolder editPh = pane.Find( "EditPlaceHolder" ) as PlaceHolder;
			PlaceHolder deletePh = pane.Find( "DeletePlaceHolder" ) as PlaceHolder;

			if( editPh != null && editPh.Widgets == null )
			{
                Button editButton = RootContext.CreateUnkownWidget(buttonType) as Button;
				editButton.Id = "Edit";
				editButton.Label = "Edit";
				editButton.OnClick += new OnClickHandler(editButton_OnClick);
				editPh.Add( editButton );
			}

			if( deletePh != null && deletePh.Widgets == null )
			{
                Button deleteButton = RootContext.CreateUnkownWidget(buttonType) as Button;
				deleteButton.Id = "Delete";
				deleteButton.Label = "Delete";
				deleteButton.OnClick += new OnClickHandler(deleteButton_OnClick);
				deletePh.Add( deleteButton );
			}
		}

        bool dataBound = false;
        public void DataBind() { grid.DataBind(); addCounts(); dataBound = true; }
        public bool IsDataBound { get { return dataBound; } set { dataBound = value; } }

		private void addCounts()
		{
			IRecordList<T> items = grid.DataSource;
            for( int i = 0; i < items.Count; i++ )
			{
                foreach (ColumnInfo fi in fieldInfos)
                {
                    if (fi.DataType == DataType.RecordList)
                    {
                        Button b = grid.Widgets[i].Find("Show" + fi.Name) as Button;
                        if (b != null)
                        {
                            IRecordList r = items[i][fi.Name] as IRecordList;
                            b.Label += r == null ? string.Empty : "(" + r.Count + ")";
                        }
                    }
                }
            }
		}

		private void add_OnClick(Widget b, string e)
		{
			//add the form.
			if( addPane == null )
			{
                addPane = new ModelForm<T>();
                addPane.buttonType = this.buttonType;
                addPane.Init();
                addPane.OnSubmit += new OnSubmitHandler<T>(Add_OnSubmit);
                addPane.id = "AddPane";
                b.Parent.Add(addPane);
			}
			else
			{
				addPane.Visible = true;
                addPane.Record = new T();
                addPane.BindForm();
			}
		}

        void Add_OnSubmit(ModelForm<T> sender, object arg)
        {
            Scaffold<T> s = sender.FindAncestor<Scaffold<T>>();
            dataSource.Add(sender.Record as T);
            //grid.AddItem(sender.Record as T);
            addPane.Visible = false;
            addPane.UnbindForm();
        }

		public override void ParseElement(System.Xml.XmlNode n)
		{
			//override for Grid, which is essenially a repeater.
			//and Add and Edit forms, which will be some sort of Pane.
            switch (n.Name)
            {
                case "GridTemplate":
                    ParseGridTemplate(n);
                    break;
                case "AvailableRecords":
                    ParseAvailableRecords(n);
                    break;
            }
		}

        Dictionary<string, AvailableRecordInfo> availableRecordLists;
        private void ParseAvailableRecords(System.Xml.XmlNode n)
        {
            //Field="InStockAt" Source="availableStores"
            if (availableRecordLists == null)
                availableRecordLists = new Dictionary<string, AvailableRecordInfo>();
            AvailableRecordInfo info = new AvailableRecordInfo();
            info.Source = n.Attributes["Source"].Value;
            if( n.Attributes["Format"] != null )
                info.Format = n.Attributes["Format"].Value;
            availableRecordLists[n.Attributes["Field"].Value] = info;
        }

        private void ParseGridTemplate(System.Xml.XmlNode n)
        {
            string model = null;
            if (n.Attributes["Model"] != null)
            {
                model = n.Attributes["Model"].Value;
                n.Attributes.Remove(n.Attributes["Model"]);
            }
            if (n.Attributes["Order"] != null)
            {
                order = n.Attributes["Order"].Value;
                n.Attributes.Remove(n.Attributes["Order"]);
            }

            Pane p = RootContext.CreateWidget<Pane>();
            p.ParseAttributes(n);
            p.ParseXml(n);

            if (model == null)
            {
                customGridTemplate = p;
            }
            else
            {
                if (customGridTemplates == null)
                    customGridTemplates = new Hashtable();
                customGridTemplates[model] = p;
            }
        }

		private void editButton_OnClick(Widget b, string e)
		{
			Template t = b.FindAncestor<Template>();
			Widget editForm = t.Widgets["editForm"];
			
			if( editForm == null )
			{
                ModelForm<T> mf = new ModelForm<T>();
                mf.buttonType = this.buttonType;
                mf.Record = t.Record;
                mf.Init();
                mf.OnSubmit += new OnSubmitHandler<T>(Edit_OnSubmit);
                mf.OnCancel += new OnCancelHandler<T>(mf_OnCancel);
                mf.id = "editForm";
                b.Parent.Parent.InsertBefore(mf);
			}
			else
			{
				editForm.Visible = true;
			}
			b.Parent.Parent.Visible = false;
		}

        void mf_OnCancel(ModelForm<T> sender)
        {
            sender.FindAncestor<Template>().Widgets[1].Visible = true;
        }

        void Edit_OnSubmit(ModelForm<T> sender, object arg)
        {
            Template t = sender.FindAncestor<Template>();
            AbstractRecord rec = t.Record;
            t.DataBindWidget();
            t.Widgets.Find("editForm").Visible = false;
            t.Widgets[1].Visible = true;
        }

		private void deleteButton_OnClick(Widget b, string e)
		{
            Scaffold<T> s = b.FindAncestor<Scaffold<T>>();
			Template t = b.FindAncestor<Template>();
            b.Record.Delete();
			if( s.Record != null )
			{
				s.Record.Save();
			}
			while( t.Widgets.Count > 0 )
                t.RemoveChild( t.Widgets[0] );
		}

        #region IDataSourced Members

        IRecordList IDataSourced.DataSource
        {
            get
            {
                return DataSource as IRecordList;
            }
            set
            {
                DataSource = value as IRecordList<T>;
            }
        }

        #endregion
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -