在SplendidCRM中添加用户控件

1.在_controls目录下新建一个web user control,名为PriceRange.ascx, 用于搜索某一个价格范围内的记录。

<%@ Control Language="C#" AutoEventWireup="False" CodeBehind="PriceRange.ascx.cs" Inherits="SplendidCRM._controls.PriceRange" %>



<asp:Table ID="Table1" BorderWidth="0" CellPadding="0" CellSpacing="0" runat="server">

    <asp:TableRow>

        <asp:TableCell>

        <table id="tblPriceRange" runat="server">            

        <tr>

        <td>Greater_than</td>

        <td><asp:TextBox ID="From_Price" runat="server"></asp:TextBox></td>

        </tr>        

         <tr>

        <td>Less_than</td>

        <td><asp:TextBox ID="To_Price" runat="server"></asp:TextBox></td>

        </tr>        

        </table>            

        </asp:TableCell>

    </asp:TableRow>

</asp:Table>

注意:设置AutoEventWireup="False" ,和其他页面保持一致,在cs中用#region Web Form Designer generated code代码段调用页事件

关于AutoEventWireup="False" 的详解http://www.cnblogs.com/qiantuwuliang/archive/2009/07/04/1517013.html

http://msdn.microsoft.com/zh-cn/library/system.web.configuration.pagessection.autoeventwireup.aspx

 

设计样式如下图:
image 

 

2. PriceRange.ascx.cs的全部代码内容:

using System;

using System.Collections.Generic;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;



namespace SplendidCRM._controls

{

    public partial class PriceRange : SplendidControl

    {

        protected void Page_Load(object sender, EventArgs e)

        {



        }



        private bool bUIRequired;

        public bool UIRequired

        {

            get { return bUIRequired; }

            set { bUIRequired = value; }

        }



        public Unit Width //初始宽度100,接受设定值

        {

            get { return From_Price.Width;}

            set

            {

                if (value.Value <= 0)

                {

                    From_Price.Width = 100;

                    To_Price.Width = 100;

                }

                else

                {

                    From_Price.Width = value;

                    To_Price.Width = value;

                }

            }

        }

        public short TabIndex

        {

            get { return From_Price.TabIndex;}

            set 

            {

            From_Price.TabIndex = value;

            To_Price.TabIndex = value; 

            }

        }



        public string FromPrice

        {

            get { return From_Price.Text; }

            set { To_Price.Text = value; }

        }



        public string ToPrice

        {

            get { return To_Price.Text; }

            set { To_Price.Text = value; }

        }



        public string FromPriceID

        {

            get { return From_Price.ID; }

            set { To_Price.ID = value; }

        }



        public string ToPriceID

        {

            get { return To_Price.ID; }

            set { To_Price.ID = value; }

        }





        #region Web Form Designer generated code

        override protected void OnInit(EventArgs e)

        {

            //

            // CODEGEN: This call is required by the ASP.NET Web Form Designer.

            //

            InitializeComponent();

            base.OnInit(e);

        }



        /// <summary>

        ///        Required method for Designer support - do not modify

        ///        the contents of this method with the code editor.

        /// </summary>

        private void InitializeComponent()

        {

            this.Load += new System.EventHandler(this.Page_Load);

        }

        #endregion

    }

}

 

3. 在 SplendidCRM.Administration.DynamicLayout.EditViews.NewRecord.ascx页面代码的

<asp:DropDownList ID="lstFIELD_TYPE" OnSelectedIndexChanged="lstFIELD_TYPE_Changed" AutoPostBack="true" Runat="server">

中添加一个ListItem:

<asp:ListItem Value="PriceRange"    >PriceRange</asp:ListItem>

image

然后在在 SplendidCRM.Administration.DynamicLayout.EditViews.NewRecord.ascx.cs的

protected override void lstFIELD_TYPE_Changed(Object sender, EventArgs e)

方法中添加一个case语句:

case "PriceRange":      spnDATA.Visible = true; spnDATA_LABEL.Visible = true; spnREQUIRED.Visible = true; spnCHANGE.Visible = false; spnTEXT1.Visible = false; spnTEXT2.Visible = true; spnTEXT3.Visible = false; spnFORMAT_ROWS.Visible = false; spnLIST_NAME.Visible = false; spnGENERAL.Visible = true; break;

 

image

 

此时在管理页面中的FiledType下拉列表中已经可以看到PriceRange控件,但它现在还不能用,还需要做后续的工作才能让它正常工作起来。

image

 

4. 在_Code/SplendidDynamic.cs的

public static void AppendEditViewFields(DataView dvFields, HtmlTable tbl, IDataReader rdr, L10N L10n, TimeZone T10n, CommandEventHandler Page_Command, bool bLayoutMode)

方法中的if ~else if的sFIELD_TYPE的判断区域添加以下代码:

 

                else if (String.Compare(sFIELD_TYPE, "PriceRange", true) == 0)

                {

                    PriceRange ctlInput = tbl.Page.LoadControl("~/_controls/PriceRange.ascx") as PriceRange;

                    ctlInput.Width = nFORMAT_SIZE;

                    ctlInput.ID = sDATA_FIELD;

                    ctlInput.TabIndex = nFORMAT_TAB_INDEX;

                    ctlInput.UIRequired = bUI_REQUIRED;

                    tdField.Controls.Add(ctlInput);

                    try

                    {

                        if (rdr !=null)

                        {

                            ctlInput.FromPrice = Sql.ToString(rdr[sDATA_FIELD]);

                            ctlInput.ToPrice = Sql.ToString(rdr[sDATA_FIELD]);

                        }

                    }

                    catch (Exception ex)

                    {

                        SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex);

                    }

                    if (bLayoutMode)

                    {

                        Literal litField = new Literal();

                        litField.Text = sDATA_FIELD;

                        tdField.Controls.Add(litField);



                    }

                }

 

6. 现在重新登录系统,reload一次,进入admin中的layout manager,在Select Edit View中选择Books.SearchBasic视图,然后将刚才制作的PriceRange用户控件添加到此视图的页面中。

image

现在回到Book模块default页面,就能看到搜索栏中多了名为Book_Price:的PriceRange用户控件了,但是它还只是个摆设,当你点击search button时并不会按照你的价格范围进行搜索,因为我还没有在SearchView用户控件中给它编写SQL方法。OK,下面继续…

image

 

7. 继续劳动^_* ,打开_Control/SearchView.ascx.cs文件,在 public virtual void SqlSearchClause(IDbCommand cmd) 方法中参照类似的DateRange用户控件的代码段写入以下代码:

                        else if (sFIELD_TYPE == "PriceRange")

                        {

                            PriceRange ctlPrice = FindControl(sDATA_FIELD) as PriceRange;

                           //PriceRange ctlToPrice = FindControl("To_Price") as PriceRange;

 

                            float fromPrice = 0;

                            float toPrice = 0;

                            if (ctlPrice != null)

                            {

                                if (!Sql.IsEmptyString(ctlPrice.FromPrice))

                                {

                                    fromPrice =Sql.ToFloat(ctlPrice.FromPrice);

                                }

                                if (!Sql.IsEmptyString(ctlPrice.ToPrice))

                                {

                                    toPrice = Sql.ToFloat(ctlPrice.ToPrice);

                                }

                            }

                            if (fromPrice != 0 || toPrice != 0)

                                Sql.AppendParameter(cmd, fromPrice, toPrice, sDATA_FIELD);

                            //需要在sql.cs中构建方法签名与此调用相符的AppendParameter方法

                        }

 

8.在_code/sql.cs中构建一个签名为public static void AppendParameter(IDbCommand cmd, float fValue1, float fValue2, string sField) 的方法:

        public static void AppendParameter(IDbCommand cmd, float fValue1, float fValue2, string sField)

        {

            if (fValue1 != 0)

            {

                cmd.CommandText += "   and " + sField + " >= @" + sField +"_From" + ControlChars.CrLf;

                //cmd.Parameters.Add("@" + sField, DbType.DateTime, 8).Value = dtValue;

                Sql.AddParameter(cmd, "@" + sField + "_From", fValue1);

            }

            if (fValue2 != 0)

            {

                cmd.CommandText += "   and " + sField + " <= @" + sField + "_To" + ControlChars.CrLf;

                //cmd.Parameters.Add("@" + sField, DbType.DateTime, 8).Value = dtValue;

                Sql.AddParameter(cmd, "@" + sField + "_To", fValue2);

            }

        }

 

编译一下,去Books页面的搜索栏试试吧,哈哈,按照价格范围搜索成功了!

你可能感兴趣的:(用户)