2011-05-23 41 views
1

我有7個網頁和一個聲明一些屬性,事件和一些功能的類。這個類的對象,即_ItemSetup被移動到所有頁面中,並且在所有頁面上保持相同的副本。基於ItemSetup類的這個對象,將採取某些業務決策並改變值。在asp.net中調用事件。但頁面屬性沒有得到反映

public class ItemSetup 
{ 

    /// <summary> 
    /// Raises an event after FK_ITEM_TYPE property has changed. 
    /// PropertyChanged object returns value of FK_ITEM_TYPE before change and after change 
    /// </summary> 
    public event EventHandler<PropertyChanged> ItemTypeChanged; 


    private long fK_ITEM_TYPE; 
    /// <summary> 
    /// Item type can be-Package, Subassembly, cash and many more. 
    /// So each item type will have different behaviour based on which validation changes. 
    /// "ItemTypeChanged" event is triggered when this property value is changed. 
    /// </summary> 
    public long FK_ITEM_TYPE 
    { 
     get { return fK_ITEM_TYPE; } 
     set 
     { 
      if (value == fK_ITEM_TYPE) 
       return; 
      fK_ITEM_TYPE = value; 

      PropertyChanged eOnChanged = new PropertyChanged(null, value); 
      if (ItemTypeChanged!= null) 
       ItemTypeChanged(this, eOnChanged); 
     } 
    } 
} 

提高事件的文件後面的代碼。

public partial class ItemMaster_Main : System.Web.UI.Page 
{ 

    public ItemSetup _ItemSetup { get; set; } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     ItemSetup.MenuBarEventAssociation(ItemMenu, SaveInputValues); 

     if (!IsPostBack) 
     { 
      BindDropDown(); 

      if (Session["ItemSetup"] != null) 
      { 
       _ItemSetup = Session["ItemSetup"] as ItemSetup; 
       //Do something. 
      } 
      else 
      { 
       _ItemSetup = new ItemSetup(ItemSetup.OperationMode.Add); 
       _ItemSetup.ItemTypeChanged += new EventHandler<PropertyChanged>(_ItemSetup_ItemTypeChanged); 

       Session["ItemSetup"] = _ItemSetup; 
      } 
     } 
     _ItemSetup = Session["ItemSetup"] as ItemSetup; 
    } 

    protected void cmbItemType_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     _ItemSetup.FK_ITEM_TYPE = long.TryParse(cmbItemType.SelectedValue, out outLong) ? outLong : (long)L_ITEM_TYPE.SelectOne; 

     // When I calls this as a functions. It do its work and sets the css. 
     //_ItemSetup_ItemTypeChanged(null, null); 
    } 

    void _ItemSetup_ItemTypeChanged(object sender, PropertyChanged e) 
    { 
     //Hide or show button based on conditions 
     btnNext.Visible = !(_ItemSetup.FK_ITEM_TYPE == (int)AARFID.DataLayer.L_ITEM_TYPE.SelectOne); 

     //Hide all controls until Item Type is not selected.   
     if (_ItemSetup.FK_ITEM_TYPE == (long)L_ITEM_TYPE.SelectOne) 
      divControlBox.Attributes.Add("style", "display:none;"); 
     else 
      divControlBox.Attributes.Add("style", "display:block;"); 
    } 
} 

當屬性FK_ITEM_TYPE被設置在任何時候_ItemSetup_ItemTypeChanged被引發的事件,所有寫進函數的代碼被執行。我預計控制應該隱藏起來。但它對頁面沒有任何作用。

我不明白爲什麼這個事件不會影響頁面。 當我在取消註釋函數的行cmbItemType_SelectedIndexChanged 即

// _ ItemSetup_ItemTypeChanged(NULL, NULL);

屬性和CSS獲取設置和頁面按預期行爲。

可能是什麼原因。

編輯

如果我那麼事件處理程序ourside關聯的IsPostBack根據需要頁面的時候影響,但事件的不斷增加上。

(_ItemSetup.ItemTypeChanged as EventHandler<PropertyChanged>).GetInvocationList() 
{System.Delegate[17]} 
    [0]: {Method = {Void ItemSetup_ItemTypeChanged(System.Object, AARFID.DataLayer.PropertyChanged)}} 
    [1]: {Method = {Void _ItemSetup_ItemTypeChanged(System.Object, AARFID.DataLayer.PropertyChanged)}} 
    [2]: {Method = {Void _ItemSetup_ItemTypeChanged(System.Object, AARFID.DataLayer.PropertyChanged)}} 
    [3]: {Method = {Void _ItemSetup_ItemTypeChanged(System.Object, AARFID.DataLayer.PropertyChanged)}} 
    [4]: {Method = {Void _ItemSetup_ItemTypeChanged(System.Object, AARFID.DataLayer.PropertyChanged)}} 
    [5]: {Method = {Void _ItemSetup_ItemTypeChanged(System.Object, AARFID.DataLayer.PropertyChanged)}} 
    [6]: {Method = {Void _ItemSetup_ItemTypeChanged(System.Object, AARFID.DataLayer.PropertyChanged)}} 
    [7]: {Method = {Void _ItemSetup_ItemTypeChanged(System.Object, AARFID.DataLayer.PropertyChanged)}} 
    [8]: {Method = {Void _ItemSetup_ItemTypeChanged(System.Object, AARFID.DataLayer.PropertyChanged)}} 
    [9]: {Method = {Void _ItemSetup_ItemTypeChanged(System.Object, AARFID.DataLayer.PropertyChanged)}} 
    [10]: {Method = {Void _ItemSetup_ItemTypeChanged(System.Object, AARFID.DataLayer.PropertyChanged)}} 
    [11]: {Method = {Void _ItemSetup_ItemTypeChanged(System.Object, AARFID.DataLayer.PropertyChanged)}} 
    [12]: {Method = {Void _ItemSetup_ItemTypeChanged(System.Object, AARFID.DataLayer.PropertyChanged)}} 
    [13]: {Method = {Void _ItemSetup_ItemTypeChanged(System.Object, AARFID.DataLayer.PropertyChanged)}} 
    [14]: {Method = {Void _ItemSetup_ItemTypeChanged(System.Object, AARFID.DataLayer.PropertyChanged)}} 
    [15]: {Method = {Void _ItemSetup_ItemTypeChanged(System.Object, AARFID.DataLayer.PropertyChanged)}} 
    [16]: {Method = {Void _ItemSetup_ItemTypeChanged(System.Object, AARFID.DataLayer.PropertyChanged)}} 

回答

1

隨着每次回發,_ItemSetup實例正在丟失其事件處理程序的正確接線,因此您必須在每次頁面加載時添加它們並在頁面卸載時將其刪除。簡稱版本:

protected void Page_PreInit(object sender, EventArgs e) 
    { 
     if (Session["ItemSetup"] == null) 
     { 
      _ItemSetup = new ItemSetup(); 
      Session["ItemSetup"] = _ItemSetup; 
     } 

     _ItemSetup = Session["ItemSetup"] as ItemSetup; 
     _ItemSetup.ItemTypeChanged += _ItemSetup_ItemTypeChanged;    
    } 

protected void Page_Unload(object sender, EventArgs e) 
    { 
     _ItemSetup.ItemTypeChanged -= _ItemSetup_ItemTypeChanged; 
    } 
+0

@nickvane:thx for response ...請檢查我已經創建了一個屬性'public ItemSetup _ItemSetup {get;組; },因爲它不在'IsPostBack'中,所以在每次加載頁面時它都會被填充。由於這個原因,每當FK_ITEM_TYPE屬性發生變化時,我的事件就會被觸發,但寫入函數「_ItemSetup_ItemTypeChanged」的代碼不會顯示其效果,即CSS未得到應用。但是如果我直接通過控件事件調用這個函數。這個CSS被應用。 – 2011-05-24 10:30:46

+1

@ shantana-gupta是的,您的ItemSetup將始終被填充,但事件處理程序僅在ItemSetup未處於會話中時添加。您需要在每次頁面加載時添加處理程序。該項目可能會從會話中檢索,但是由於該頁面是另一個實例,因此您已經丟失了事件處理程序。你有沒有試過我提供的代碼? – nickvane 2011-05-24 10:36:00

+0

@nickvane:我明白了......當我看到這個時,我不知道原因。事件越來越多,所以我沒有預料到事件沒有接線。我正在嘗試你的代碼。 – 2011-05-24 10:39:02

0

頁面加載方法在處理事件之前被觸發。 ASP頁面生命週期相當複雜,但你應該讓你的事件處理程序完成這項工作,而不是頁面加載方法。

+0

thx更新。我試着調試代碼。請注意。 ''當我把它作爲一個函數調用時。它做它的工作,並設置CSS。 // _ Itemsetup_ItemTypeChanged(null,null);'當我使用上面的代碼時,我得到我正在尋找的東西。即使我嘗試調試代碼。它按預期運行所有事件。唯一的結果是沒有得到體現。 – 2011-05-23 14:41:51

相關問題