2

我正在使用C#/ ASP.NET和SQL Server數據庫在Visual Studio 2010中工作。我正在嘗試修復一個網站,這個網站可以讓管理人員爲員工分配各種任務。現在的問題是,如果兩個經理同時工作,可能會將錯誤的員工分配給一個任務。員工列表以gridview表示。由於GridView中的舊數據選擇錯誤的項目

該問題似乎發生是因爲其中一個用戶在GridView中查看舊數據。

假設的第一人載入列表,並在GridView看起來是這樣的:

-Employee 1

-Employee 2

-Employee 3

-Employee 4

然後第二個人進來併爲員工2分配任務,該員工從列表中移除員工2。實際列表現在看起來是這樣的:

-Employee 1

-Employee 3

-Employee 4

但第一人仍然認爲這是因爲他們的頁面還沒有更新:

-Employee 1

-Employee 2

-Employee 3

-Employee 4

的第一個人,然後嘗試分配僱員3所述的任務。他們仍然看到舊名單。當他們點擊進行分配時,頁面會回覆到服務器(顯然,在gridview控件中選擇一行是服務器端事件,所以我不確定是否有辦法繞過這個http://forums.asp.net/t/1706468.aspx/1)。該頁面重新加載並嘗試執行回發事件,檢查並發現該控件尚未生效(因爲數據綁定發生在回發事件應該處理之後),所以我認爲回發事件會延遲到數據綁定之後。 (這裏是上一個頁面加載http://msdn.microsoft.com/en-us/library/ms178472(v=vs.100).aspx事件的順序)。一旦gridview的已數據綁定,數據是最新的是這樣的:

-Employee 1

-Employee 3

-Employee 4

然後可以處理回發事件。回發事件包含所選控件的行索引。第三行被選中,所以回發事件從網格中獲得僱員4(現在在第三行)。然後,當我們想要員工3的唯一ID時,它使用該信息獲取員工4的唯一ID。我們如何確保在這種情況下獲得正確的員工ID?

問題似乎是數據綁定發生後應用了單擊並更改了網格。我認爲阻止頁面回發將是一件好事,但gridview操作都是服務器端,所以我不認爲我可以這樣做。我不知道通過回發來保存綁定數據的方法,因此每次回發時我們都有義務獲取新的,可能不同的數據。 我覺得我已經走過了大部分的選擇,你是否看到我的推理有什麼問題,或者有什麼新的嘗試建議?有沒有辦法在頁面回覆之前獲取員工ID?

該頁面對於只有一個用戶正常工作,該問題僅在多個用戶同時進行更改時纔會發生。

回答

0

我不得不自己處理數據綁定,而不是使用ObjectDataSource自動執行它。

此前我曾使用GridView的DataSourceID將其鏈接到一個數據源,該數據源將在每個頁面刷新時向服務器查詢數據。 ObjectDataSource使數據自動綁定。爲了獲得我需要的額外控制權,我必須處理頁面後面的代碼中的所有數據綁定。

我這樣做是通過在視圖狀態中存儲gridview數據,並在每次刷新頁面時從視圖狀態加載數據。這樣我可以控制gridview數據何時更新數據庫中的數據。

這兩個頁面是非常有幫助的把我送到我的回答:

DataBind and Postback

http://www.aarongoldenthal.com/post/2009/04/19/Manually-Databinding-a-GridView.aspx

2

您可以爲控件啓用ViewState,以便在回發期間不必重新加載GridView數據。

取而代之的是,控件會記住回發期間第一次加載的數據,並繼續處理該數據。

當然,這並不能解決您的併發問題,例如,如果有人對已經被刪除的員工進行了某些操作。在這種情況下,您必須在執行操作之前再次檢查實際數據庫,並在用戶使用舊數據時向用戶顯示錯誤/警告。

+0

這正是那種解決方案,我正在尋找;我們假設用戶現在將使用單獨的數據。 我只是嘗試啓用ViewState,但無論如何加載的數據。除非明確告訴它,否則確保不會重新加載嗎? 謝謝! – Sauce 2013-05-09 16:41:16

+0

您是如何加載數據的?確保你只在'Page.IsPostback'爲false時調用數據綁定。那麼不應該重新加載數據。 – magnattic 2013-05-09 19:35:28

+0

我將GridView的DataSourceID設置爲ObjectDataSource,該ObjectDataSource將請求發送到服務器以獲取數據。我認爲必須自動調用數據綁定,因爲我不在代碼中的任何位置調用數據綁定。 – Sauce 2013-05-09 19:46:20