문제

내가 개발된 사용자 지정 제어를 확장하는 목록 상자.아이디어는 제어'기억'수정하는 요소를 발생한 클라이언트 측의,예를 들어,의 결과로 AJAX 요청을 합니다.

그것이 작동하는 방법은 제어하는 또한 렌더링하고 숨겨진 입력하고,그 결과의 AJAX 요청에 저장되고 숨겨진 입력합니다.이것은 다시 게시하고,통제의 LoadPostData()메소드 보기 숨겨진 입력에 대한 경고 숨겨진 입력있는 데이터가 생성 ListItem 컬렉션에서습니다.

이 완벽하게 작동 그래서 사용자가 만든 목록에서 선택 상자.지 않은 경우,이 LoadPostData()메소드를 얻지 않고,따라서 새로운 ListItem 컬렉션가 만들어지지 않습니다.(나는 설정을 사용하여 이를 디버거.)

가정 LoadPostData 방법만 호출하는 경우 게시물을 데이터 컬렉션을 포함한 데이터 해당하 제어의 고유 id(i.e'이름'특성에 HTML).는 경우에는 사용자지 않을 선택 목록 상자에서,아무것은에 포함된 게시물에 대한 데이터 목록자의 고유 id 와 LoadPostData()호출하지 않습니다.는 것입니다.

할 수 있는 사람을 제안할 수 있는 방법을 확인하는 내용의 ListBox LoadPostData()메소드가 호출되는 모든 다시 게시는지 여부에 관계없이 사용자가 선택?

사전에 감사합니다-나는 정말이 붙어 이 하나입니다.

David

도움이 되었습니까?

해결책 3

POST 데이터가 컨트롤의 icqualiD와 같은 이름의 항목이없는 경우 loadPostData () 메서드가 호출되지 않는다고 설정했습니다. [편집 : 전화 걸기 PAGE.REGISTERREQUIRESPOSTBACK init () 동안이를 극복 할 수 있습니다.] 이유를 알 수 있습니다.하지만 그것은 매우 제한됩니다.

i 전혀 loadPostData () 메소드 중에 문제를 처리함으로써 문제를 극복했습니다. 대신 onload ()를 대신 호출하는 방법으로 처리했습니다.

이 접근 방식을 사용할 때 두 가지 일이 마음에 듭니다.

1) 더 이상 loadPostData () 메서드에 전달 된 PostCollection NameValueCollection 객체에 액세스 할 수 없습니다. 즉, 약간 더 열심히 일하는 request.form 컬렉션에서 게시물 데이터를 추출해야합니다. 2) Onload ()는 ViewState 처리 코드 후에 발생하므로 ListItem을 만드는 후에 SelectedValue를 수동으로 설정해야합니다. 그렇지 않은 경우 Ajax를 통해 ListBox가 채워지고 사용자가 선택하면 선택이 손실됩니다.

이것은 미래에 누군가를 돕기를 바랍니다.

다른 팁

저는 조금 늦게이 점프 하지만,향후 참조를 위해,여기에 내가 어떻게 달성 비슷한...

나의 통제는 나무에 사용하는 템플릿에 대한 노드입니다.의 문제를 다루고 있었으로 이 방법을 캡처하는 클라이언트 측의 변경을 확대/축소된 상태의 노드입니다.무슨 일어난다:

에 CreateChildControls 추가 숨겨져 필드를 컨트롤 컬렉션의 루트를 제어합니다.

protected override int CreateChildControls(IEnumerable dataSource, bool dataBinding)
{
    ...
    _cdExpanded = new HiddenField();
    _cdExpanded.ID = "cdExpanded";
    this.Controls.Add(_cdExpanded);
    ...
}

에 OnInit call

protected override void OnInit(EventArgs e)
{
    ...
    Page.RegisterRequiresPostBack(this);
    ...
}

에 LoadPostData 찾에 값을 포스트 컬렉션과 일치하는 고유 id(지 않 키)의 숨겨진된 필드:

public bool LoadPostData(string postDataKey, System.Collections.Specialized.NameValueCollection postCollection)
{
    ...
    string cdExpanded = postCollection[_cdExpanded.UniqueID];
    ...
}

에서 클래스에 대한 개별 노드가 코드를 채우는 onclick 이벤트의 내 toggle 버튼 호출을 자바스크립트 함수는 ID 의 기본 컨트롤과 노드를 개별적으로 인수입니다.

    string ToggleScript
    {
        get
        {
            return "ToggleNode('" + this.ClientID + "', '" + _TreeRoot.ClientID + "');";
        }
    }
    protected override void Render(HtmlTextWriter writer)
    {
        ...
        if (this.HasChildren)
        {
            writer.AddAttribute("onclick", ToggleScript);
        }
        ...
    }

이것은 그래서 그것을 찾기 숨겨진된 필드를 매우 쉽게 getElementById:

function ToggleNode(nodeID, treeID) {
var cdExpanded = document.getElementById(treeID + "_cdExpanded");
...
}

JavaScript 다음을 수정하는 값의 숨겨진 분야에 필요한 이벤트가 발생했습니다.우리가 다시 서버를 분석 내용을 이 필드의 수정하 제어 상태로 필요하기 전에 다시 렌더링되었습니다.(주의:나는 실제로 사용하 3 숨겨진된 필드를 추적하기 위한 다양한 이벤트이지만 개념일)

이 미래에 다른 사람에...

항목이 선택된 경우에만 정말로 이상하게 작동합니다.LoadPostData가 호출되는지 확인하는 빠른 방법으로 추적을 사용하도록 설정하고 iPostBackDataHandler.loadPostData (...)에 다음을 넣으십시오.

Page.Trace.Write("My control", "LoadPostData");
.

그런 경우 다음이 있는지 확인해야합니다.

Page.RegisterRequiresPostBack(this) in OnInit
.

여기에 전체 샘플 제어가 있습니다.

using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel.Design;
using System.ComponentModel;
using System.Web.UI.Design;

namespace Controls
{
    public sealed class ExtendedListBoxDesigner : ControlDesigner
    {

        public override string GetDesignTimeHtml()
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("<div>My designer</div>");
            return sb.ToString();
        }

    }

    [DesignerAttribute(typeof(ExtendedListBoxDesigner), typeof(IDesigner))]
    public class ExtendedListBox : ListBox, INamingContainer, IPostBackDataHandler 
    {
        bool IPostBackDataHandler.LoadPostData(string postDataKey, System.Collections.Specialized.NameValueCollection postCollection)
        {
            Page.Trace.Write("ExtendedListBox", "LoadPostData");
            return true;
        }


        protected override void OnInit(EventArgs e)
        {
            Page.RegisterRequiresPostBack(this);
            base.OnInit(e);
        }

        protected override void RenderContents(HtmlTextWriter writer)
        {
            base.RenderContents(writer);
            writer.Write(string.Format("<input type=\"hidden\" name=\"{0}_dummy\" value=\"alwaysPostBack\">", this.ID));
        }

    }
}
.

및 페이지가 다음과 같습니다.

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="ControlSamlpe._Default" Trace="true" %>
<%@ Register Assembly="Controls" Namespace="Controls" TagPrefix="sample" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <sample:ExtendedListBox runat="server" ID="extListBox"></sample:ExtendedListBox>
    <asp:Button runat="server" ID="go" />
    </div>
    </form>
</body>
</html>
.

이동을 클릭하면 추적에 "loadpostdata"가 표시되어야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top