显示数据与存储方式

从上面一个例子 子窗口选择多值返回至父窗口的文本框中 中看到,用户看到的和选择的始终是友善的数据。我们不能可能选择的是名称,显示的是ID,或是存入数据库的是ID,显示的还是ID。下图是沿继上一例子,进入编辑状态。需要把存在数据库的数据显示出来。在子窗口的记录,把已经选择的值,还是实现Highlight出来。

 

存在数据库中的数据,只是存入异常编码的ID,用";"分隔。

 现在我们要处理这个ID,转换为真实名称,并显示于编辑页面的文本框中。我们在数据库(本演示数据实例是SQL Server2012)中,写一个函数:

ExpandedBlockStart.gif View Code
SET ANSI_NULLS  ON
GO
SET QUOTED_IDENTIFIER  ON
GO

CREATE  FUNCTION  [ dbo ]. [ udf_ExceptionalDescription ]
(    
     @ExceptionalDescription  NVARCHAR( MAX)
)
RETURNS  NVARCHAR( MAX)
AS
BEGIN
-- 宣告一个表变量
DECLARE  @t  AS  TABLE ( [ en ]  NVARCHAR( MAX))
-- 使用一个自定义函数,处理分隔符的字符串,并转为表记录。然后与异常表的记录JOIN起来。这样就可以获取异常名称。
--
  http://www.cnblogs.com/insus/archive/2012/02/26/2368283.html
INSERT  INTO  @t  SELECT  [ ExceptionalName ]  FROM  [ dbo ]. [ udf_SplitStringToTable ]( @ExceptionalDescription, ' ; 'AS nbr  LEFT  JOIN  [ dbo ]. [ Exceptional ]  AS e  ON (nbr. [ KeyWord ]  = e. [ Exceptional_nbr ])

RETURN ( SELECT  STUFF(( SELECT  ' '  +  CAST( [ en ]  AS  NVARCHAR( MAX))
FROM  @t  FOR XML PATH ( '')), 1, 2, ''))
END 

 

下面尝试运行一个这个函数。

 

这样子,我们就可以在编辑的记录的SELECT时,使用到这个函数了。

ok,前台绑定文本框时,

this.TextBoxExceptionalDescription.Text = objDataRow["ED_Collections"].ToString();

 

 接下来,我们需要处理子窗的数据与选中的值并Highlight至Repeater控件中。我们首选要让系统知道已经有哪些记录是选中的值(也就是文本框的值)。

ExpandedBlockStart.gif View Code
SET ANSI_NULLS  ON
GO
SET QUOTED_IDENTIFIER  ON
GO


ALTER  PROCEDURE  [ dbo ]. [ usp_Exceptional_GetByPinZhongPrimaryKey ]
(
    @PinZhongId  TINYINT,
    @Selected  NVARCHAR( MAX)
)
AS
-- 宣告一个表变量,其中一个字段[Opt],就是为文本框的值准备。如果有其值,那这个字段值为1,反之为0
DECLARE  @t  AS  TABLE( [ Opt ]  BIT  DEFAULT( 0), [ Key_Id ]  INT)
-- 把文本框的值拆分并插入这个表变量中。有关这个函数,可以参考 http://www.cnblogs.com/insus/archive/2012/02/26/2368283.html
INSERT  INTO  @t  SELECT  1[ KeyWord ]  FROM udf_SplitStringToTable( REPLACE( @Selected, ' ', ' ; '), ' ; ')

IF  OBJECT_ID( ' #exceptional 'IS  NOT  NULL
     DROP  TABLE #exceptional
CREATE  TABLE #exceptional(
     [ Exceptional_nbr ]  [ smallint ],
     [ ExceptionalName ]  [ nvarchar ]( 50),
     [ Description ]  [ nvarchar ]( 100),
     [ IsActive ]  [ bit ],
)

INSERT  INTO #exceptional  SELECT e. [ Exceptional_nbr ], [ ExceptionalName ],e. [ Description ], [ IsActive ]  FROM  [ dbo ]. [ AllocationExceptional ]  AS ae
INNER  JOIN  [ dbo ]. [ Exceptional ]  AS e  ON (ae. [ Exceptional_nbr ]  = e. [ Exceptional_nbr ]  AND ae. [ IsEnable ]  =  1  AND ae. [ PinZhongId ]  =  @PinZhongId)

-- 下面的SELECT语句所得到的结果,就是前台子窗口的Repeater控件的数据源。
SELECT  [ Exceptional_nbr ], [ ExceptionalName ], [ Description ], [ IsActive ], ( CASE  [ Opt ]  WHEN  1  THEN  1  WHEN  NULL  THEN  0  ELSE  0  ENDAS  [ Opt ]  FROM #exceptional  AS e
LEFT  JOIN  @t  AS t  ON (e. [ Exceptional_nbr ]  = t. [ Key_Id ])
WHERE  [ IsActive ]  =  1 
ORDER  BY  [ ExceptionalName ]

 

 在前台的编辑页面中,我就可以参考下面的方法进行对子窗口的Repeater控件数据绑定,由于多个地方绑定数据源,因此Insus.NET重构了这个方法,然后在Page_Load,拉号下拉菜单时,都可以使用到这个方法,这样不必在这两个地方,都写同样的代码。

ExpandedBlockStart.gif View Code
  private  void ExceptionalDataBinding( string pinHaoId)
    {
        objExceptional.PinHaoId = ConvertData.ToSmallInt(pinHaoId);
        objExceptional.ExceptionalCollections = Session[ " ExceptionalCollections "].ToString();
         this.RepeaterobjExceptionalList.DataSource = objExceptional.GetExceptionalByPinHaoPrimaryKeyAndOption();
         this.RepeaterobjExceptionalList.DataBind();
    }

 

在Page_Load事件中写:

  Session[ " ExceptionalCollections "] = objDataRow[ " ExceptionalDescription "].ToString();
        ExceptionalDataBinding(objDataRow[ " PinHaoId "].ToString());

 

在下拉菜单中的选择事件中:

ExpandedBlockStart.gif View Code
  protected  void DropDownListPinHao_SelectedIndexChanged( object sender, EventArgs e)
    {
        DropDownList DDL = (DropDownList)sender;
         if (DDL.SelectedIndex == - 1return;

        ExceptionalDataBinding(DDL.SelectedItem.Value);
    }   

 

到此为止,只是数据绑定,我们要Highlight子窗口的记录。为子窗口的Repeater控件写一个事件:OnItemDataBound="RepeaterobjExceptionalList_ItemDataBound"

ExpandedBlockStart.gif View Code
  protected  void RepeaterobjExceptionalList_ItemDataBound( object sender, RepeaterItemEventArgs e)
    {
         if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            DataRowView drv = (DataRowView)e.Item.DataItem;

             if (e.Item.FindControl( " tr1 ") !=  null && e.Item.FindControl( " CheckBoxId ") !=  null)
            {
                HtmlTableRow htr = (HtmlTableRow)e.Item.FindControl( " tr1 ");
                CheckBox cb = (CheckBox)e.Item.FindControl( " CheckBoxId ");
                 if (drv[ " Opt "].ToString() ==  " 1 ")
                {
                    cb.Checked =  true;
                    htr.Attributes.CssStyle.Add( " background-color "" #ffdab9 ");
                }
                 else
                {
                    cb.Checked =  false;
                    htr.Attributes.CssStyle.Add( " background-color """);
                }
            }
        }
    }

 

上面的事件中,就用上了数据库附添加的字段[Opt]。如果Opt的值是1,就设置行的背景色,反之设为""。

本例也只是提供大致的流程与重点代码。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值