2014-11-21 59 views
0

我正在嘗試編寫一個Web應用程序來收集用戶數以用於審計目的。我有一個可以運行的Oracle查詢(我在SQL Developer中運行它),但是我正在嘗試通過web爲超級用戶提供此報告來取代他們自己的計數而不依賴於我。我無法在gridview中顯示數據。將數據綁定到Gridview固定行,可變列

Oracle查詢(用戶的硬編碼固定金額):

select * from (
select ad.display_name, ev.creator from auditdefinition ad, event ev 
where ad.event_class_id = ev.object_class_id and ev.create_date >= to_date('01-OCT-2014','dd-MON-yyyy') and ev.create_date < to_date('01-DEC-2014','dd-MON-yyyy') 
) 
pivot 
(
count(creator) 
for creator in ('user1','user2','user3','user4') 
) 
order by display_name; 

結果顯示是這樣的:

------------------------------------------ 
|  | user1 | user2 | user3 | user4 | 
------------------------------------------ 
| Create | 5  | 2  | 8  | 15 | 
------------------------------------------ 
| Delete | 9  | 6  | 10 | 1  | 
------------------------------------------ 
| View | 123 | 461 | 84 | 89 | 
------------------------------------------ 
***note: Create, Delete, View are from "display_name" from the query 

我知道該怎麼做時,「列」是固定的(我用另一個查詢做了另一個表),但是因爲我不知道會有多少「userX」,所以我不知道如何在Web中動態構建它並將其顯示在網格中。爲GridView控件

ASPX代碼:

<asp:GridView AutoGenerateColumns="False" CellPadding="2" CellSpacing="2" GridLines="none" HorizontalAlign="Left" ID="GridView2" runat="server"> 
     </asp:GridView> 

aspx.cs後臺代碼:

DataSet ds = new DataSet(); 

DataTable dt = ds.Tables.Add("Amount"); 
//I would normally add my columns here if they were fixed but because it it dynamic, I am not sure 



... 

GridView2.DataSource = dt; //beginning to bind my DataTable 
GridView2.DataBind(); 
+1

是否有一個原因你不能設置'AutoGenerateColumns =「True」'? – entropic 2014-11-21 23:42:37

+0

我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 – 2014-11-21 23:48:22

+0

Dang,菜鳥錯誤...我甚至沒有注意到AutoGenerateColumns屬性。我已經從我的第一個具有固定列數的GridView複製了我的GridView,但沒有注意到它。謝謝你的提示! – Jayarikahs 2014-11-23 03:01:55

回答

0

無論您在GridView控件中如何聲明AutoGenerateColumns="False",都需要指定Columns標籤,其中包含所有列及其各自的數據值。既然你說你不知道有多少「userX」會在那裏,讓GridView控件爲你綁定數據,只需將你希望在GridView中看到的數據正確地傳遞給DataTable \ DataSet並將AutoGenerateColumns屬性設置爲true: -

<asp:GridView AutoGenerateColumns="True" CellPadding="2" CellSpacing="2" GridLines="none" HorizontalAlign="Left" ID="GridView2" runat="server"> 
</asp:GridView> 

更新: -

您可以獲取並填寫直接使用dataadapter數據集: -

string CS = "Your connection string"; 
using (SqlConnection conn = new SqlConnection(CS)) 
{ 
    SqlDataAdapter da = new SqlDataAdapter("SPName", conn); 
    da.SelectCommand.CommandType = CommandType.StoredProcedure; 
    da.SelectCommand.Parameters.Add("@yourParam", SqlDbType.Int/*Your datatype*/).Value = 123; 
    DataSet ds = new DataSet(); 
    da.Fill(ds); 
    GridView2.DataSource = ds; 
    GridView2.DataBind(); 
} 
+0

感謝您的提示!我將它更改爲「true」,但我仍然無法使用DataTable爲查詢中的用戶創建「列」。我還沒有想出如何動態地做到這一點,因爲它給了我「輸入數組比這個表中的列數多。」我懷疑(很確定)這是因爲DataTable。 – Jayarikahs 2014-11-23 03:06:55

+0

@Jayarikahs - 如果你的列不固定,爲什麼你要手動填充它?你可以使用'DataAdapter'來爲你填充它。 – 2014-11-23 03:13:28

+0

@Jayarikahs - 請檢查我的更新,看看是否有幫助。 – 2014-11-23 03:26:00

0

如果用戶1,用戶2和用戶N可以從表中讀取說tb_users,它會使你的腳本更輕鬆。

select * from (
select ad.display_name, ev.creator from auditdefinition ad, event ev 
where ad.event_class_id = ev.object_class_id and 
ev.create_date >= to_date('01-OCT-2014','dd-MON-yyyy') and 
ev.create_date < to_date('01-DEC-2014','dd-MON-yyyy')) 
pivot 
(
count(creator) 
for creator in (select username from tb_users) 
) 
order by display_name; 

如果你這樣做,有Web表單上的下拉列表,並將其綁定表tb_users

在此下拉菜單,你可以在你的GridView有關於用戶選擇的數據綁定的選擇事件。

+0

我的用戶不在單獨的表格中。當用戶執行某個操作時,會對其進行審覈,並在我的「事件」表中創建一條記錄,該表將用戶名存儲在「創建者」列中。 – Jayarikahs 2014-11-23 03:04:30