我有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)}}
@nickvane:thx for response ...請檢查我已經創建了一個屬性'public ItemSetup _ItemSetup {get;組; },因爲它不在'IsPostBack'中,所以在每次加載頁面時它都會被填充。由於這個原因,每當FK_ITEM_TYPE屬性發生變化時,我的事件就會被觸發,但寫入函數「_ItemSetup_ItemTypeChanged」的代碼不會顯示其效果,即CSS未得到應用。但是如果我直接通過控件事件調用這個函數。這個CSS被應用。 – 2011-05-24 10:30:46
@ shantana-gupta是的,您的ItemSetup將始終被填充,但事件處理程序僅在ItemSetup未處於會話中時添加。您需要在每次頁面加載時添加處理程序。該項目可能會從會話中檢索,但是由於該頁面是另一個實例,因此您已經丟失了事件處理程序。你有沒有試過我提供的代碼? – nickvane 2011-05-24 10:36:00
@nickvane:我明白了......當我看到這個時,我不知道原因。事件越來越多,所以我沒有預料到事件沒有接線。我正在嘗試你的代碼。 – 2011-05-24 10:39:02