복붙노트

[SQL] 중첩 된 리피터 및 SqlDataSource와 매개 변수

SQL

중첩 된 리피터 및 SqlDataSource와 매개 변수

나는 여기에서 논의하지 않을 이유 테이블을 구축하는 중첩 된 리피터를 사용하고 있지만은 두 개의 데이터 소스, 행에 해당됩니다 최상위 리피터 하나, 두 번째 레벨 하나를 가지고 어떻게 찾고 어떻게 행 내에서 세포를 반환합니다 리피터.

내가 궁금한 건 내가 어떻게 든 첫 번째 데이터 소스의 결과에서 필드를 설정 중첩 된 리피터의 데이터 소스에 매개 변수를 지정할 수있는 경우에, 그러나, 무엇입니까?

나는 데이터 바인딩 식의 값에 매개 변수를 설정할 수 있습니까?

내가 이렇게 할 이유는 내가 두 개의 저장 프로 시저를 가지고있다. 페이지가 내가 처음 저장 프로 시저를 실행하는 데 사용할 수있는 매개 변수 I는 그러나, 세션이로드 될 때, 두 번째 저장 프로 시저, 나는 두 번째 저장 프로 시저를 호출 최고 수준 리피터의 각 인스턴스에서 값을 연결해야합니다 다른 파라미터 값.

해결법

  1. ==============================

    1.나는 가장 좋은 방법은, 바깥 리피터의하여 ItemDataBound 이벤트를 처리 내부 데이터 소스 컨트롤을 찾아 그것을 위해 SelectParameter을 설정하는 것입니다 생각합니다.

    나는 가장 좋은 방법은, 바깥 리피터의하여 ItemDataBound 이벤트를 처리 내부 데이터 소스 컨트롤을 찾아 그것을 위해 SelectParameter을 설정하는 것입니다 생각합니다.

        void MyOuterRepeater_ItemDataBound(Object sender, RepeaterItemEventArgs e) 
        {
        // Find the Inner DataSource control in this Row.
        SqlDataSource s = (SqlDataSource)e.Item.FindControl("InnerDataSource");
    
        // Set the SelectParameter for this DataSource control
        // by re-evaluating the field that is to be passed.
        s.SelectParameters["MyParam"].DefaultValue = DataBinder.Eval(e.Item.DataItem, "MyFieldValueToPass").ToString();
        }
    

    DataList에 사용 예를 들어, 다음은 ASP.NET의 퀵 스타트 체크 아웃

    P.S : 위의 발표 조각에 중요한 수정을 위해 아래 토니의 답변을 참조하시기 바랍니다. 특히, 현재 RepeaterItem의 ItemType은을 확인하는 것이 필수적 일 것이다. 또한, 항상 모든 개체에 널 (null)를 확인 할 수있는 좋은 습관이다.

  2. ==============================

    2.나는 매개 변수 이후로 사용할 값을 저장하기에 HiddenField를 사용하여이 작업을했다. 일을 가져옵니다.

    나는 매개 변수 이후로 사용할 값을 저장하기에 HiddenField를 사용하여이 작업을했다. 일을 가져옵니다.

    <asp:SqlDataSource ... />
    <asp:Repeater ...>
        <ItemTemplate>
    
            <asp:HiddenField ID="txtOuterID" runat="server" Value='<%# Eval("ID") %>' Visible="false" />
    
            <asp:SqlDataSource ...>
                <SelectParameters>
                    <asp:ControlParameter Name="OuterID" Type="Int32" ControlID="txtOuterID" PropertyName="Value" />
                </SelectParameters>
            </asp:SqlDataSource>
    
            <asp:Repeater ...>
    
        </ItemTemplate>
    </asp:Repeater>
    
  3. ==============================

    3.Cerebrus의 대답은 하나 개 잡기가 있다는 것을 제외하고 작동합니다. 당신은 내가 생각하는이 질문의 규칙을 준수하지 않는 한 당신은 널 (null) 예외를 얻을 것이다 :

    Cerebrus의 대답은 하나 개 잡기가 있다는 것을 제외하고 작동합니다. 당신은 내가 생각하는이 질문의 규칙을 준수하지 않는 한 당신은 널 (null) 예외를 얻을 것이다 :

    어떻게하여 ItemDataBound 동안 바인딩 된 항목의 존재의 데이터에 액세스하려면?

    기본적으로, 나는 다른 머리글과 바닥 글이 문제가 발생할 것입니다, 문제의 항목이 항목이나 교류 항목 있는지 확인하기 위해 확인해야합니다.

    편집 : 나는 또한 데이터 소스를 얻을 수의 FindControl를 사용하려고 시도하는 오류를 얻었다. 나는 데이터 소스에 액세스 갔을 때, 나는 두 번째 널 (null) 예외를 가지고, 그래서의 FindControl은 널 (null)을 반환했습니다. 그래서 간단하게 직접 객체를 액세스 끝났다. 데이터 소스 어쨌든 디자이너 파일에 선언되어있다. 그래서이와, 드디어 작업에 중첩 된 리피터를 얻었다.

    // Find the Inner DataSource control in this Row.
    
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == 
        ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.EditItem)
    {
        CellsDataSource.SelectParameters["testRunID"].DefaultValue = 
            DataBinder.Eval(e.Item.DataItem, "TestRunID").ToString();
    }
    
  4. ==============================

    4.당신의 sproc 통화의 양을 줄일 수있는 기술을 조사 할 수 있습니다. 이 같은 저장 프로 시저에서 여러 결과 집합을 반환 할 수 있습니다. 닷넷 데이터 세트는 쉽게 하나 개의 테이블에서의 DataRow를 가지고 다른 데이터 테이블의 모든 자식 노드를 얻을 수있어 여러 데이터 테이블 간의 관계를 정의 할 수있는 기능이 있습니다. 전의:

    당신의 sproc 통화의 양을 줄일 수있는 기술을 조사 할 수 있습니다. 이 같은 저장 프로 시저에서 여러 결과 집합을 반환 할 수 있습니다. 닷넷 데이터 세트는 쉽게 하나 개의 테이블에서의 DataRow를 가지고 다른 데이터 테이블의 모든 자식 노드를 얻을 수있어 여러 데이터 테이블 간의 관계를 정의 할 수있는 기능이 있습니다. 전의:

    exampleData.Relations.Add(New DataRelation("FOO_RELATION", exampleData.Tables["TABLE_A"].Columns["ID"], exampleData.Tables["TABLE_B"].Columns["PARENT_ID"]));
    

    그런 다음 TABLE_A의 모든의 DataRow에서이 같은 모든 아이들에 액세스 할 수 있습니다 :

    DataRow[] childRows = row.GetChildRows("FOO_RELATION");
    

    이보다 효율적이고 이럴 아니라 쉽다. 이 방법 당신은 당신의 중계기에 대한 이벤트 처리기에 sproc에 전화를 구울 필요가 없습니다.

  5. ==============================

    5.난 당신이 다음 반환 된 중계기에서의 FindControl를 호출 중첩 된 리피터에 첫 번째 통화의 FindControl에 있기 때문에의 FindControl 호출이 널 (null)을 반환 생각합니다.

    난 당신이 다음 반환 된 중계기에서의 FindControl를 호출 중첩 된 리피터에 첫 번째 통화의 FindControl에 있기 때문에의 FindControl 호출이 널 (null)을 반환 생각합니다.

    Repeater rpt  = (Repeater)e.Item.FindControl("rptNested");
    SqlDataSource s = (SqlDataSource)rpt.FindControl("InnerDataSource");
    
  6. from https://stackoverflow.com/questions/491537/nested-repeaters-and-sqldatasource-parameters by cc-by-sa and MIT license