2009-06-30 3 views
1

ASP.NET 서버 컨트롤 내에서 만들어진 HiddenField 컨트롤이 있습니다. ValueChanged 이벤트에 대한 새 EventHandler를 추가했습니다.HiddenField EventHandler Javascript를 통해 변경 될 때 ValueChanged가 실행되지 않음

내 HiddenField 값이 자바 스크립트 함수 내에서 변경되면이 이벤트가 발생합니까?

내가 겪고있는 주된 문제는 값이 변경되었거나 적어도 다시 게시되기 전에 내 HiddenField 서버 측 값을 검색하려고하는 것입니다. 내가 그 페이지가 포스트 백을 일으키는 버튼을 포함하고 처음에 SaveControlState/LoadControlState를 사용하여 시도한 페이지 내에서 서버 컨트롤을 가지고 있지만 포스트 백이 발생하기 전에 SaveControlState가 호출되지 않은 이유가 있습니다. ValueChanged 이벤트 내에서 또는 다시 게시하기 전에 값을 캡처 할 수 있어야합니다. - 초기로드시 또는 다시 게시 중 하나 컨트롤을 렌더링 된 페이지 통화 중

public class ObjectTree : WebControl { 
private CA.TreeView _treeView; 
private HiddenField fldCheckedNodes = new HiddenField(); 
public CA.TreeView TreeView { 
    get { return _treeView; } 
    set { _treeView = value; } 
} 
public ObjectTree() { 
    _treeView = new CA.TreeView(); 
    _treeView.ID = "objectTree"; 
    fldCheckedNodes.ID = "fldCheckedNodes"; 
} 
protected void fldCheckedNodes_ValueChanged(Object sender, EventArgs e) { 
    string test = fldCheckedNodes.Value; 
} 
protected override void OnPreRender(EventArgs e) { 
    TreeView.ClientSideOnNodeCheckChanged = TreeView.ClientID + "NodeChecked"; 
    fldCheckedNodes.ValueChanged += new EventHandler(fldCheckedNodes_ValueChanged); 
    if (!Page.ClientScript.IsClientScriptBlockRegistered("jscript")) { 
     StringBuilder jscript = new StringBuilder(); 
     jscript.AppendLine(" function " + TreeView.ClientID + "UpdateCheckedNodes() {"); 
     jscript.AppendLine(" var x = 0;"); 
     jscript.AppendLine(" var nodeArray = " + TreeView.ClientID + ".get_nodes().get_nodeArray();"); 
     jscript.AppendLine(" var nodeLength = nodeArray.length;"); 
     jscript.AppendLine(" document.getElementById('" + fldCheckedNodes.ClientID + "').value = \"\";");     
     jscript.AppendLine(" for (x=0; x < nodeLength; x++) {"); 
     jscript.AppendLine("  examineNode(nodeArray[x]);"); 
     jscript.AppendLine(" }"); 
     jscript.AppendLine(" var result = document.getElementById('" + fldCheckedNodes.ClientID + "').value;"); 
     jscript.AppendLine(" return true;"); 
     jscript.AppendLine(" }"); 
     jscript.AppendLine(" function examineNode(node) {"); 
     jscript.AppendLine(" var y = 0;"); 
     jscript.AppendLine(" var childNodes = node.get_nodes().get_nodeArray();"); 
     jscript.AppendLine(" var childNodeLength = childNodes.length;");   
     jscript.AppendLine(" if (node.get_checked()) {"); 
     jscript.AppendLine("  if (document.getElementById('" + fldCheckedNodes.ClientID + "').value.length > 0) {"); 
     jscript.AppendLine("   document.getElementById('" + fldCheckedNodes.ClientID + "').value += \",\"; "); 
     jscript.AppendLine("   document.getElementById('" + fldCheckedNodes.ClientID + "').value += node.get_id();"); 
     jscript.AppendLine("  } else {"); 
     jscript.AppendLine("   document.getElementById('" + fldCheckedNodes.ClientID + "').value += node.get_id();"); 
     jscript.AppendLine("  }"); 
     jscript.AppendLine(" }");    
     jscript.AppendLine(" if (childNodeLength >= 1) {"); 
     jscript.AppendLine("  for (y=0; y < childNodeLength; y++) {"); 
     jscript.AppendLine("   examineNode(childNodes[y]);"); 
     jscript.AppendLine("  }"); 
     jscript.AppendLine(" } ");  
     jscript.AppendLine(" }"); 
     jscript.AppendLine("</script>"); 
     Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "jscript", jscript.ToString()); 
    } 
    base.OnPreRender(e); 
} 
protected override void CreateChildControls() { 
    Controls.Add(TreeView); 
    Controls.Add(fldCheckedNodes); 
} 
protected override void RenderContents(HtmlTextWriter output) { 
    TreeView.RenderControl(output); 
    fldCheckedNodes.RenderControl(output); 
    } 

}

답변

1

서버 측 코드에만 화재 :

여기에 코드입니다.

숨겨진 필드 PRIOR에서 PostBack까지의 값이 필요하면 클라이언트 측 JavaScript에서 작업해야합니다. 예를 들어, JavaScript에서 "checkedNodesChanged function"이라는 함수를 만들고 JavaScript로 이벤트 리스너를 등록하여 거기에서 작업 할 수 있습니다. 출력은 다음과 같이 표시되어야합니다.

<input type="hidden" id="fldCheckedNodes" onchange="checkedNodesChanged();" /> 

제어 코드 숨김 코드에이를 추가하는 방법이있을 수 있습니다. 다음과 같이하십시오 :

fldCheckedNodes.Attributes.Add("onchange", "checkedNodesChanged();"); 

checkNodesChanged의 의미있는 용기를 만들어야합니다.
서버 측 ValueChanged 이벤트는 포스트 백 동안 서버의 페이지 수명주기 동안에 만 시작되고 값이 원본 페이지로드의 원래 값 또는 ViewState에 저장된 마지막 값과 다른 것으로 확인됩니다. 게시 뒤로 마지막 시간.

아마도이 UpdateCheckedNodes는 "checkedNodesChanged()"함수입니다. 그럴 경우, 내가 가지고있는 것 대신에 그것을 부르십시오.

관련 문제