2010-06-04 57 views
0

這是一個經典的問題,我想,但似乎大多數人都有興趣讓文本框導致回發。我不是。我只是希望事件在發生回發時觸發。ASP.NET文本框TextChanged事件沒有在自定義EditorPart中觸發

我創建了一個帶有自定義編輯部分的webpart。編輯器部分使用文本框和按鈕進行渲染。點擊按鈕會打開一個對話框。當對話框關閉時,它通過javascript設置文本框的值,然後使用編輯器部分的ClientID執行__doPostBack

回發發生,但TextChanged事件永遠不會觸發,我不確定這是否是調用方式__doPostBack的問題,或者是因爲我設置事件處理程序的方式,或者某種情況其他。以下是我認爲是編輯器部分代碼的相關部分:

protected override void CreateChildControls() 
{ 
    _txtListUrl = new TextBox();    

    _txtListUrl.ID = "targetSPList"; 
    _txtListUrl.Style.Add(HtmlTextWriterStyle.Width, "60%"); 
    _txtListUrl.ToolTip = "Select List"; 
    _txtListUrl.CssClass = "ms-input"; 
    _txtListUrl.Attributes.Add("readOnly", "true"); 
    _txtListUrl.Attributes.Add("onChange", "__doPostBack('" + this.ClientID + "', '');"); 
    _txtListUrl.Text = this.ListString;         

    _btnListPicker = new HtmlInputButton(); 
    _btnListPicker.Style.Add(HtmlTextWriterStyle.Width, "60%"); 
    _btnListPicker.Attributes.Add("Title", "Select List"); 
    _btnListPicker.ID = "browseListsSmtButton"; 
    _btnListPicker.Attributes.Add("onClick", "mso_launchListSmtPicker()"); 
    _btnListPicker.Value = "Select List"; 

    this.AddConfigurationOption("News List", "Choose the list that serves as the data source.", 
     new Control[] { _txtListUrl, _btnListPicker }); 

    if (this.ShowViewSelection) 
    { 
     _txtListUrl.TextChanged += new EventHandler(_txtListUrl_TextChanged); 
     _ddlViews = new DropDownList(); 
     _ddlViews.ID = "_ddlViews"; 
     this.AddConfigurationOption("View", _ddlViews); 
    } 
} 

protected override void OnPreRender(EventArgs e) 
{ 
    ScriptLink.Register(this.Page, "PickerTreeDialog.js", true); 

    string lastSelectedListId = string.Empty; 
    if (!this.WebId.Equals(Guid.Empty) && !this.ListId.Equals(Guid.Empty)) 
    { 
     lastSelectedListId = SPHttpUtility.EcmaScriptStringLiteralEncode(
      string.Format("SPList:{0}?SPWeb:{1}:", this.ListId.ToString(), this.WebId.ToString())); 
    } 

    string script = "\r\n    var lastSelectedListSmtPickerId = '" + lastSelectedListId + "';" 
        + "\r\n    function mso_launchListSmtPicker(){" 
        + "\r\n     if (!document.getElementById) return;" 
        + "\r\n" 
        + "\r\n     var listTextBox = document.getElementById('" + SPHttpUtility.EcmaScriptStringLiteralEncode(_txtListUrl.ClientID) + "');" 
        + "\r\n     if (listTextBox == null) return;" 
        + "\r\n" 
        + "\r\n     var serverUrl = '" + SPHttpUtility.EcmaScriptStringLiteralEncode(SPContext.Current.Web.ServerRelativeUrl) + "';" 
        + "\r\n" 
        + "\r\n     var callback = function(results) {" 
        + "\r\n      if (results == null || results[1] == null || results[2] == null) return;" 
        + "\r\n" 
        + "\r\n      lastSelectedListSmtPickerId = results[0];" 
        + "\r\n      var listUrl = '';" 
        + "\r\n      if (listUrl.substring(listUrl.length-1) != '/') listUrl = listUrl + '/';" 
        + "\r\n      if (results[1].charAt(0) == '/') results[1] = results[1].substring(1);" 
        + "\r\n      listUrl = listUrl + results[1];" 
        + "\r\n      if (listUrl.substring(listUrl.length-1) != '/') listUrl = listUrl + '/';" 
        + "\r\n      if (results[2].charAt(0) == '/') results[2] = results[2].substring(1);" 
        + "\r\n      listUrl = listUrl + results[2];" 
        + "\r\n      listTextBox.value = listUrl;" 
        + "\r\n      __doPostBack('" + this.ClientID + "','');" 
        + "\r\n     }" 
        + "\r\n     LaunchPickerTreeDialog('CbqPickerSelectListTitle','CbqPickerSelectListText','websLists','', serverUrl, lastSelectedListSmtPickerId,'','','/_layouts/images/smt_icon.gif','', callback);" 
        + "\r\n    }"; 

    this.Page.ClientScript.RegisterClientScriptBlock(typeof(ListPickerEditorPart), "mso_launchListSmtPicker", script, true); 

    if ((!string.IsNullOrEmpty(_txtListUrl.Text) && _ddlViews.Items.Count == 0) || _listSelectionChanged) 
    { 
     _ddlViews.Items.Clear(); 
     if (!string.IsNullOrEmpty(_txtListUrl.Text)) 
     { 
      using (SPWeb web = SPContext.Current.Site.OpenWeb(this.WebId)) 
      { 
       foreach (SPView view in web.Lists[this.ListId].Views) 
       { 
        _ddlViews.Items.Add(new ListItem(view.Title, view.ID.ToString())); 
       } 
      } 
      _ddlViews.Enabled = _ddlViews.Items.Count > 0; 
     } 
     else 
     { 
      _ddlViews.Enabled = false; 
     } 
    } 

    base.OnPreRender(e); 
} 

void _txtListUrl_TextChanged(object sender, EventArgs e) 
{ 
    this.SetPropertiesFromChosenListString(_txtListUrl.Text); 
    _listSelectionChanged = true; 
} 

任何想法?

更新:我忘了提及這些方法,這是所謂上面:

protected virtual void AddConfigurationOption(string title, Control inputControl) 
{ 
    this.AddConfigurationOption(title, null, inputControl); 
} 

protected virtual void AddConfigurationOption(string title, string description, Control inputControl) 
{ 
    this.AddConfigurationOption(title, description, new List<Control>(new Control[] { inputControl })); 
} 

protected virtual void AddConfigurationOption(string title, string description, IEnumerable<Control> inputControls) 
{ 
    HtmlGenericControl divSectionHead = new HtmlGenericControl("div"); 
    divSectionHead.Attributes.Add("class", "UserSectionHead"); 
    this.Controls.Add(divSectionHead); 

    HtmlGenericControl labTitle = new HtmlGenericControl("label"); 
    labTitle.InnerHtml = HttpUtility.HtmlEncode(title); 
    divSectionHead.Controls.Add(labTitle); 

    HtmlGenericControl divUserSectionBody = new HtmlGenericControl("div"); 
    divUserSectionBody.Attributes.Add("class", "UserSectionBody"); 
    this.Controls.Add(divUserSectionBody); 

    HtmlGenericControl divUserControlGroup = new HtmlGenericControl("div"); 
    divUserControlGroup.Attributes.Add("class", "UserControlGroup"); 
    divUserSectionBody.Controls.Add(divUserControlGroup); 

    if (!string.IsNullOrEmpty(description)) 
    { 
     HtmlGenericControl spnDescription = new HtmlGenericControl("div"); 
     spnDescription.InnerHtml = HttpUtility.HtmlEncode(description); 
     divUserControlGroup.Controls.Add(spnDescription); 
    } 

    foreach (Control inputControl in inputControls) 
    { 
     divUserControlGroup.Controls.Add(inputControl); 
    } 
    this.Controls.Add(divUserControlGroup); 

    HtmlGenericControl divUserDottedLine = new HtmlGenericControl("div"); 
    divUserDottedLine.Attributes.Add("class", "UserDottedLine"); 
    divUserDottedLine.Style.Add(HtmlTextWriterStyle.Width, "100%"); 
    this.Controls.Add(divUserDottedLine); 
} 

回答

1

它可以幫助,如果類聲明事件處理程序(在你的情況的EditorPart,我猜)實現系統.Web.UI.INamingContainer。你是否將_txtListUrl添加到Controls集合中?

編輯:

  • 確保_txtListUrl的AutoPostBack屬性設置爲true(_txtListUrl.AutoPostBack = TRUE)。

  • _txtListUrl.Attributes.Add("onChange"可能會干擾事件處理程序。

  • 僅當文本框失去焦點時纔會調用TextChanged。

+0

很好的問題。起初我認爲這是問題 - 我根本沒有將控件添加到Controls集合,但可悲的是(我猜),我是。請參閱上面添加的「AddConfigurationOption」方法。 – 2010-06-04 16:54:23

+0

原來我沒有設置editorpart的ID。一旦我確定了,事件就開始奏效。我會將你的答案標記爲答案,因爲你幫助我思考了所有這些機制,即使你沒有專門提到這一點。 – 2010-06-07 16:21:44

相關問題