2014-12-21 2 views
0

내 aspx 페이지에 사용자 정의 컨트롤과 GridView가 포함되어 있습니다. 사용자 정의 컨트롤 내의 버튼을 클릭하면 DataTable이 만들어지고, 해당 DataTable에 대한 aspx 페이지의 GridView 데이터 소스를 설정해야합니다.UserControl의 결과에 gridview 바인딩하는 방법?

"RaiseBubbleEvent"메서드를 사용하여 부모 페이지에 단추를 클릭하는 이벤트를 전달했지만 이벤트를 전달할 필요는 없으며 만든 DataTable도 전달해야합니다.

이 내 사용자 컨트롤입니다 :

protected DataTable getSearchResults(object sender, EventArgs e) 
     { 
      string FieldName=DDLSearch.SelectedValue; 
      string SearchText=txtSearch.Text.Replace(" ",""); 

      RaiseBubbleEvent(this, e); 
      return _BLTablesSearch.getSearchResults(FieldName, SearchText); 
     } 

이 UserControl을 내 페이지 withing에 있습니다 : :

<td> 
      <uc1:QuickSearchControl runat="server" id="QuickSearchControl" /> 
    </td> 

<table> 
    <tr> 
     <td style="width: 10%"> 
      <asp:Label ID="lblSearch" runat="server" Text="Search" Width="50px" Font-Size="Medium"></asp:Label> 
     </td> 

     <td style="width: 10%"> 
      <asp:DropDownList CssClass="myddl" ID="DDLSearch" runat="server" Width="100px" OnSelectedIndexChanged="DDLRefugeeSearch_SelectedIndexChanged"> 
      </asp:DropDownList> 
     </td> 
     <td style="width: 10%"> 
      <asp:TextBox CssClass="mytextbox" ID="txtSearch" runat="server"></asp:TextBox> 
     </td> 
     <td style="width: 10%"> 
      <asp:Button ID="BtnGo" runat="server" Text="Go" OnClick="getSearchResults" /> 

     </td> 
    </tr> 


</table> 

이 코드는 "getSearchResult"이벤트 뒤에입니다 그래서 내 질문은 어떻게 할 수있는 다음과 같습니다 :

1- 사용자 제어의 이동 버튼을 클릭하면, 상위 페이지
4- 구속 할
-3- 창을 사용자가 컨트롤에 데이터 테이블이 요구되는 작업을 수행 상위 페이지
2-에 이벤트를 발생시킬

: 그 데이터 테이블

편집의 GridView는 :

이것은 사용자 제어 코드 @Lior 라즈의 대답은 다음과 다음과 같이

내 코드를 업데이트

public string TableName; 
    BLTablesSearch _BLTablesSearch = new BLTablesSearch(); 
    public delegate void SearchComplete(DataTable FilteredData); 
    public event SearchComplete OnSearchComplete; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!Page.IsPostBack) 
     { 
      DDLSearch.DataSource = _BLTablesSearch.getSearchFields(TableName); 
      DDLSearch.DataTextField = "FieldText"; 
      DDLSearch.DataValueField = "FieldValue"; 
      DDLSearch.DataBind(); 
     } 
    } 

    protected void getSearchResults(object sender, EventArgs e) 
    { 
     string FieldName=DDLSearch.SelectedValue; 
     string SearchText=txtSearch.Text.Replace(" ",""); 



    } 

이 영문 페이지 코드 :

BLPerson BLPerson = new BLPerson(); 
    BLREOptions BLREOptions = new BLREOptions(); 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!Page.IsPostBack) 
     { 
      PersonListGridView.DataSource = BLPerson.getAllPersons(); 
      PersonListGridView.DataBind(); 
      QuickSearchControl.TableName = "Person"; 

     } 
     QuickSearchControl.OnSearchComplete += new UserControls.QuickSearchControl.SearchComplete(HandleOnSearchComplete); 

    } 

    public void HandleOnSearchComplete(DataTable _searchResult) 
    { 

    } 
+0

[ "sessionname"]이 선을 명확히 주시겠습니까 다른 페이지 – SK2185

답변

1

내가이 버블 링 방식을 사용하여 많은 자식 컨트롤이 때 어수선 코드로 이어질 수 있기 때문에 그것은 가난한 디자인 선택이라고 생각 RaiseBubbleEvent를 사용하지 않는, 위임과 이벤트를 사용하여 대신 프로그램의 흐름을 제어하십시오. 또한

public delegate void SearchComplete(DataTable FilteredData); 
public event SearchComplete OnSearchComplete; 

를 원래의 DataTable을 (당신이 검색을 취소 할 때 그래서 당신은 필터링되지 않은 결과를 표시 할 수 있습니다)

을 유지하는 특성을 가지고 : 당신의 UserControl에서

클래스 선언에 다음 줄을 추가 UserControl을 코드 ​​:

당신의 ASPX 페이지에서
public DataTable AllRecords { get { return Session["AllRecords"]; } set { Session["AllRecords"] = value;} } 
public string TableName; 
BLTablesSearch _BLTablesSearch = new BLTablesSearch(); 
public delegate void SearchComplete(DataTable FilteredData); 
public event SearchComplete OnSearchComplete; 

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 
     DDLSearch.DataSource = _BLTablesSearch.getSearchFields(TableName); 
     DDLSearch.DataTextField = "FieldText"; 
     DDLSearch.DataValueField = "FieldValue"; 
     DDLSearch.DataBind(); 
    } 
} 



protected void getSearchResults(object sender, EventArgs e) 
{ 
    string FieldName=DDLSearch.SelectedValue; 
    string SearchText=txtSearch.Text.Replace(" ",""); 

    // TODO: filter the AllRecords Table according to what ever you want 
    DataTable filteredRecords = YourFilteringFunction(FieldName,SearchText); 

    if(OnSearchComplete != null) 
     OnSearchComplete(filteredRecords); 
} 

단지 UserControl을 속성 (즉 DataTable의 보유)에 DataTable의를 할당및 UserControl 이벤트에 등록하십시오.

등록 된 함수에서 모눈의 DataSource를 FilteredData에 할당하고 모눈의 Bind 함수를 호출하십시오.

ASPX 코드 :

세션을 사용하여
BLPerson BLPerson = new BLPerson(); 
BLREOptions BLREOptions = new BLREOptions(); 

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 
     DataTable allPersons = BLPerson.getAllPersons(); 
     QuickSearchControl.AllRecords = allPersons; 
     PersonListGridView.DataSource = allPersons; 
     PersonListGridView.DataBind(); 
     QuickSearchControl.TableName = "Person"; 

    } 
    QuickSearchControl.OnSearchComplete += new UserControls.QuickSearchControl.SearchComplete(HandleOnSearchComplete); 

} 

public void HandleOnSearchComplete(DataTable _searchResult) 
{ 
     PersonListGridView.DataSource = _searchResult; 
     PersonListGridView.DataBind(); 
} 
+0

에 한 페이지를 얻어야한다 : 당신의 ASPX 페이지가 단지 UserControl을 속성에 DataTable의를 할당에 (즉, DataTable을 보유하고 있습니다. – user3340627

+0

올바른지 확인한 다음이 DataTable을 UserControl의 속성에 배치하면 ASPX 페이지에 DataTable을로드한다고 가정합니다. 그렇다면 데이터를로드하는 것이 aspx 응답 및 검색 컨트롤이 아니라고 생각하기 때문에 그렇게하는 것이 좋습니다 –

+0

조정 된 코드로 내 질문을 업데이트합니다. 누락 된 점을 알려 주면 감사하겠습니다. – user3340627

관련 문제