1

ASP.NET サーバー コントロール内に作成された HiddenField コントロールがあります。ValueChanged イベントに新しい EventHandler を追加しました。

HiddenField の値が JavaScript 関数内から変更された場合、このイベントは発生しますか?

私が抱えている主な問題は、値が変更されたとき、または少なくともポストバックの前に、サーバー側の 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);
  }

}

4

1 に答える 1

1

サーバー側コードは、コントロールをレンダリングしているページへの呼び出し中 (初期ロード中または PostBack 中) にのみ起動します。

非表示フィールド PRIOR から PostBack までの値が必要な場合は、クライアント側 JavaScript で作業を行う必要があります。たとえば、JavaScript で "function checkedNodesChanged" という関数を作成し、JavaScript でイベント リスナーを登録することで、そこで作業を行うことができます。出力は次のようになります。

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

コントロールのコード ビハインドにこれを追加する方法がおそらくあります。何かのようなもの:

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

checkedNodesChanged の意味のある部分を作成する必要があります。
サーバー側の ValueChanged イベントは、PostBack 中のサーバーでの Page ライフサイクル中にのみ発生し、値が元のページ ロードの元の値、または最後に PostBack されたときに ViewState に格納された最後の値と異なることを検出します。時間。

おそらく、この UpdateCheckedNodes は、私が参照している「checkedNodesChanged()」関数ですか? その場合は、私が持っているものの代わりにそれを呼び出してください。

于 2009-07-01T03:55:14.193 に答える