從上面一個例子 子視窗選擇多值傳回至父視窗的文本框中 中看到,使用者看到的和選擇的始終是友善的資料。我們不能可能選擇的是名稱,顯示的是ID,或是存入資料庫的是ID,顯示的還是ID。下圖是沿繼上一例子,進入編輯狀态。需要把存在資料庫的資料顯示出來。在子視窗的記錄,把已經選擇的值,還是實作Highlight出來。
存在資料庫中的資料,隻是存入異常編碼的ID,用";"分隔。
現在我們要處理這個ID,轉換為真實名稱,并顯示于編輯頁面的文本框中。我們在資料庫(本示範資料執行個體是SQL Server2012)中,寫一個函數:
View Code
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
CREATE FUNCTION [dbo].[udf_ExceptionalDescription]
(
@ExceptionalDescription NVARCHAR(MAX)
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
--宣告一個表變量
DECLARE @t AS TABLE ([en] NVARCHAR(MAX))
--使用一個自定義函數,處理分隔符的字元串,并轉為表記錄。然後與異常表的記錄JOIN起來。這樣就可以擷取異常名稱。
-- javascript:void(0)
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控件中。我們首選要讓系統知道已經有哪些記錄是選中的值(也就是文本框的值)。
ALTER PROCEDURE [dbo].[usp_Exceptional_GetByPinZhongPrimaryKey]
(
@PinZhongId TINYINT,
@Selected NVARCHAR(MAX)
--宣告一個表變量,其中一個字段[Opt],就是為文本框的值準備。如果有其值,那這個字段值為1,反之為0
DECLARE @t AS TABLE([Opt] BIT DEFAULT(0),[Key_Id] INT)
--把文本框的值拆分并插入這個表變量中。有關這個函數,可以參考 javascript:void(0)
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 END) AS [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,拉号下拉菜單時,都可以使用到這個方法,這樣不必在這兩個地方,都寫同樣的代碼。
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());
在下拉菜單中的選擇事件中:
protected void DropDownListPinHao_SelectedIndexChanged(object sender, EventArgs e)
DropDownList DDL = (DropDownList)sender;
if (DDL.SelectedIndex == -1) return;
ExceptionalDataBinding(DDL.SelectedItem.Value);
}
到此為止,隻是資料綁定,我們要Highlight子視窗的記錄。為子視窗的Repeater控件寫一個事件:OnItemDataBound="RepeaterobjExceptionalList_ItemDataBound"
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", "");
}
}