這篇文章將建立一列包含CheckBox控件的DataGrid,這個(gè)控件允許用戶對(duì)明細(xì)瀏覽進(jìn)行多列選擇。如果沒有恢復(fù)對(duì)于動(dòng)態(tài)SQL獲得該功能的一種方法,那么必須使用IN操作。
在文章的結(jié)尾,我們寫了一個(gè)SQL Server用戶自定義函數(shù)(UDF),為了將一個(gè)字符串分解成帶分隔符的子字符串。在這篇文章中,我們能看到這樣一個(gè)UDF如何派得上用場(chǎng)。我們將建立一個(gè)web表單,在此用戶可以通過(guò)選擇checkbox控件而選擇一些在DataGrid中的記錄。對(duì)這些被檢查的記錄的明細(xì)將會(huì)出現(xiàn)在表單中的另一個(gè)DataGrid中。這個(gè)表單像來(lái)如圖所示。
在下面顯示了我們用來(lái)建立表單的aspX。注意:如何使用TemplateColumn和Checkbox控件增加DataGrid列。我們也使用DataGrid的DataKeyField屬性來(lái)告訴對(duì)象,在數(shù)據(jù)庫(kù)記錄的哪一個(gè)字段將會(huì)包含第一行的關(guān)鍵字標(biāo)示符。
<form id="Form1" method="post" runat="server">
<asp:DataGrid id="DataGrid1" runat="server"
AutoGenerateColumns="False" DataKeyField="EmployeeID">
<Columns>
<asp:TemplateColumn>
<ItemTemplate>
<asp:CheckBox runat="server" ID="EmployeeCheckBox" />
</ItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn>
<ItemTemplate>
<%# DataBinder.Eval(Container.DataItem, "LastName") %>,
<%# DataBinder.Eval(Container.DataItem, "FirstName") %>
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:DataGrid>
<hr>
<asp:Button id="Orders" runat="server" Text="View Orders"></asp:Button>
<hr>
<asp:DataGrid ID="DataGrid2" Runat="server" AutoGenerateColumns="True" />
</form>
當(dāng)表單加載初始化時(shí),需要組裝頂端的DataGrid。代碼使用EnterPRise Library來(lái)存取SQL Sever Northwind例子數(shù)據(jù)庫(kù)并且執(zhí)行“SELECT EmployeeID,F(xiàn)irstName,LastName FROM Employees”這一語(yǔ)句。加載事件的代碼如下:
private void Page_Load(object sender, System.EventArgs e)
{
if(!Page.IsPostBack)
{
Database db = DatabaseFactory.CreateDatabase();
DBCommandWrapper dbCommandWrapper;
using(dbCommandWrapper = db.GetSqlStringCommandWrapper(SELECT_EMPLOYEES))
{
using (IDataReader dataReader = db.ExecuteReader(dbCommandWrapper))
{
DataGrid1.DataSource = dataReader;
DataGrid1.DataBind();
}
}
}
}
當(dāng)用戶單擊“Orders”按鈕時(shí),我們想顯示與數(shù)據(jù)庫(kù)中的那些與Employees相配并與Orders數(shù)據(jù)相關(guān)的第二個(gè)數(shù)據(jù)表格。這樣做的一種方法是建立動(dòng)態(tài)的SQL并且使用所有EmployeeIDs所需的WHERE語(yǔ)句的OR條件。
第二個(gè)方法是使用WHERE語(yǔ)句的IN操作。IN操作將會(huì)一列表達(dá)式進(jìn)行比較。例如,下列語(yǔ)句返回employee中IDS 7和4之間的信息。
SELECT EmployeeID, FirstName, LastName FROM Employees WHERE EmployeeID IN (7, 4)
在觀念上說(shuō),我愿意使用一個(gè)單一字符串參數(shù)來(lái)查詢所傳遞的IDs,然而,也許作為一個(gè)單字符串,不能對(duì)IN操作使用一個(gè)單一字符串參數(shù)。如果那樣,SQL語(yǔ)句會(huì)這樣“WHERE Employee IN (‘7,4’)”,并且數(shù)據(jù)庫(kù)因?yàn)镋mployeeID屬于類型int—不屬于varchar類型而返回一個(gè)錯(cuò)誤消息。
不過(guò),我們使用文章中構(gòu)造的split函數(shù)將字符串分離成不同的值。向split函數(shù)傳遞字符串‘7,4’,并且我們會(huì)得到與值4和7相對(duì)應(yīng)的兩條記錄。選擇employees并且計(jì)算它們的定單總數(shù)的SQL查詢,將會(huì)如下:
SELECT count(*) AS Orders, E.FirstName, E.LastName
FROM Orders O
INNER JOIN Employees E ON O.EmployeeID = E.EmployeeID
WHERE E.EmployeeID IN(SELECT Value FROM fn_Split(@employeeIDs, ','))
GROUP BY FirstName, LastName
ORDER BY count(*) DESC
使用以上查詢所需要的是必須建立和傳遞@employeeIDs參數(shù)。這個(gè)參數(shù)將是用逗號(hào)隔開的IDs列表。為了建立該字符串,為了弄明白行是否被用戶選擇,我們需要使用一個(gè)循環(huán),這一循環(huán)以行數(shù)循環(huán)次數(shù),并且檢查每一個(gè)checkbox控件。如果用戶選擇了行,通過(guò)從表的DataKeys屬性中(它被建立在ASPX文件中來(lái)指向EmployeeID字段)提取檢驗(yàn)人,將關(guān)鍵字保存在employee中。
private string GetCheckedEmployeeIDs()
{
String delimiter = String.Empty;
StringBuilder employeeIDs = new StringBuilder();
for(int i = 0; i < DataGrid1.Items.Count; i++)
{
CheckBox checkbox;
checkbox = DataGrid1.Items[i].FindControl("EmployeeCheckBox") as CheckBox;
if(checkbox != null && checkbox.Checked == true)
{
employeeIDs.Append(delimiter + DataGrid1.DataKeys[i].ToString()) ;
delimiter = ",";
}
}
return employeeIDs.ToString();
}
以上方法返回一個(gè)字符串,像“10,7,20”。對(duì)Orders按鈕單擊事件處理器將涉及這樣一個(gè)方法,將信息傳遞至SQL以得到employees和orders的列表,并且將其結(jié)果綁定在第二個(gè)DataGrid對(duì)象中。
private void Orders_Click(object sender, System.EventArgs e)
{
string employeeIDs = GetCheckedEmployeeIDs();
Database db = DatabaseFactory.CreateDatabase();
DBCommandWrapper dbCommandWrapper;
using(dbCommandWrapper = db.GetSqlStringCommandWrapper(SELECT_ORDERS))
{
dbCommandWrapper.AddInParameter("@employeeIDs", DbType.String, employeeIDs);
using (IDataReader dataReader = db.ExecuteReader(dbCommandWrapper))
{
DataGrid2.DataSource = dataReader;
DataGrid2.DataBind();
}
}
}
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注