gridview에 동적으로 컨트롤을 추가한 후 더 이상 컨트롤 또는 gv.selectedvalue에 액세스할 수 없습니다.

웨스 H

gv.DataBinding 이벤트에서 동적으로 일부 필드를 gridview에 추가하고 있습니다. C#에서 선택, 페이징 및 정렬을 처리하고 있습니다. 모든 것이 화면에 제대로 렌더링되고 데이터가 gridview에 로드되는 것을 볼 수 있습니다.

<asp:GridView ID="gvPulledBills" runat="server" AutoGenerateColumns="false" 
    OnDataBinding="gvPulledBills_DataBinding" OnRowDataBound="gvPulledBills_RowDataBound" 
    OnSelectedIndexChanged="gvPulledBills_SelectedIndexChanged"  
    AllowSorting="true" OnSorting="gvPulledBills_Sorting" 
    AllowPaging="true" PageSize="30" OnPageIndexChanging="gvPulledBills_PageIndexChanging"
    DataKeyNames="Id" SkinID="gridviewGray">

gv.SelectedIndexChanged 이벤트에서 선택한 행의 ID를 검색해야 합니다. Id는 HiddenField에 저장되고 gv.DataKeyNames 값은 ID로 설정되므로 두 가지 방법으로 검색할 수 있습니다.

gv.SelectedValue는 초기 렌더링 후에 제대로 작동합니다. 그러나 페이징/정렬 후 행을 선택할 때 gv.SelectedValue는 null을 반환합니다. 선택한 행 마크업이 올바르게 작동하더라도 아무 것도 선택되지 않은 것처럼 작동합니다. 열을 동적으로 바인딩할 때 데이터 키를 검색할 수 있도록 하기 위해 수행해야 하는 작업에 대한 제안 사항이 있습니까?

또는 gv.SelectedValue에 의존하지 않고 숨겨진 필드에 직접 액세스하려고 시도했습니다...

protected void gvPulledBills_SelectedIndexChanged(object sender, EventArgs e)
{
    GridView gv = (GridView)sender;
    //var key = (int)gv.SelectedValue;
    var index = gv.SelectedIndex - (gv.PageIndex * gv.PageSize);
    var row = gv.Rows[index];
    var hiddenField = (HiddenField)row.FindControl("hdnId");
    var key = int.Parse(hiddenField.Value);
    ...
}

그러나 컨트롤 컬렉션은 화면에 데이터가 있더라도 명시적으로 선언된 필드의 경우에도 모든 셀에서 비어 있습니다. 명시적 선언

<Columns>
    <asp:TemplateField>
        <ItemTemplate>
            <asp:HiddenField ID="hdnId" runat="server" Value='<%# Eval("Id") %>' />
        </ItemTemplate>
    </asp:TemplateField>
</Columns>

동적 선언

private TemplateField CreateTemplateField()
{
    var controls = new List<Control>
    {
        { CreateHiddenIdField() }
    };
    var tf = GridViewTools.CreateTemplateField(string.Empty, string.Empty, controls);
    tf.ItemStyle.CssClass = "noRightBorder";
    tf.HeaderStyle.CssClass = "noBorder";
    return tf;
}
private static Control CreateHiddenIdField()
{
    var hdn = new HiddenField();
    hdn.ID = "hdnId";
    hdn.Value = "'<%# Eval(\"Id\") %>'";
    return hdn;
}
//in static class GridViewTools
public static TemplateField CreateTemplateField(string headerText, string sortExpression, List<Control> controls)
    {
        TemplateField tf = new TemplateField();
        tf.HeaderText = headerText;
        tf.SortExpression = sortExpression;
        tf.ItemTemplate = new GridViewTemplate(DataControlRowType.DataRow, controls);

        return tf;
    }

//... snippet that adds column to grid
    var addColumns = new List<DataControlField>();        
    addColumns.Add(CreateTemplateField());
    // add other columns
    foreach (var column in addColumns)
    {
        gv.Columns.Add(column);
    }
//...

동적 열이 있는 페이징/정렬 뒤의 코드를 사용할 때 SelectedValue를 채우는 방법에 대한 제안이 있는 사람이 있습니까? 또는 동적으로 생성된 필드 컨트롤이 코드 숨김에서 채워지고 액세스 가능하도록 하는 방법에 대한 제안 사항이 있습니까?

더 많은 열이 추가되었으며 대부분 바인딩된 필드가 있습니다. 페이지의 다른 위치에 있는 드롭다운 필드를 기반으로 열 집합을 사용자 지정하기 위해 이 작업을 수행하고 있습니다. 총 열이 약 30개이며 모든 열에 대한 가시성을 설정하는 것보다 gridview에 모두 추가하지 않는 것이 좋습니다.

업데이트 솔루션 이에 대한 최종 솔루션은 다음과 같습니다.

var gv = (GridView)sender;
var rowIndex = gv.SelectedIndex - (gv.PageIndex * gv.PageSize);
var key = (int)gv.DataKeys[rowIndex]["Id"];
DisplayWorkDetail(key);

SelectedRow그리고 SelectedValue이 시점에서 null입니다. SelectedIndex채워집니다. SelectedIndexRowIndex 로 변환 하여 행에서 직접 DataKey를 검색할 수 있었습니다.

다른 GridView와 함께 사용할 메서드로 쉽게 추출할 수 있도록 보낸 사람을 사용하여 코드를 일반화하기로 했습니다.

알버트 D. 칼랄

나는 당신이 여기에서 sender를 사용할 수 없다고 생각합니다.

그러나 Rowcommand는 선택한 인덱스를 변경하지 않았지만 해당 인덱스 변경 이벤트에서는 변경되었습니다. 따라서 컨트롤을 직접 사용/참조할 수 있습니다.

예:

       GridViewRow myGv As GridViewRow = gvPulledBills.SelectedRow

그런 다음: myGv.RowIndex(행 인덱스 가져오기/사용).

그러나 이미 행이 있으므로 다음을 수행합니다.

   hiddenField myField = (HiddenField)myGv.FindControl("hdnId");
   
   int MyKey = int.Parse(myField.Value);

Datakeys 컬렉션을 사용하고 숨겨진 필드가 없다고 가정할 수도 있습니다.

따라서 다음과 같이 할 수 있습니다.

  GridViewRow myGv As GridViewRow = gvPulledBills.SelectedRow

  int RowPK = (int)(gvPulledBills.DataKeys[myGv.RowIndex]["ID"]);

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

TOP 리스트

  1. 1

    PrematureCloseException : 연결이 너무 일찍 닫혔습니다.

  2. 2

    MDRotatingPieChart를 회전하면 각도 대신 x / y 위치가 변경됩니다.

  3. 3

    c # 웹 사이트에서 텍스트를 복사하는 방법 (소스 코드 아님)

  4. 4

    jfreecharts에서 x 및 y 축 선을 조정하는 방법

  5. 5

    ArrayBufferLike의 typescript 정의의 깊은 의미

  6. 6

    Ionic 2 로더가 적시에 표시되지 않음

  7. 7

    복사 / 붙여 넣기 비활성화

  8. 8

    Google Play Console에서 '예기치 않은 오류가 발생했습니다. 나중에 다시 시도해주세요. (7100000)'오류를 수정하는 방법은 무엇입니까?

  9. 9

    정점 셰이더에서 카메라에서 개체까지의 XY 거리

  10. 10

    QT Designer를 사용하여 GUI에 이미지 삽입

  11. 11

    java Apache POI Word 기존 테이블 셀 스타일 및 서식이있는 행 삽입

  12. 12

    Kubernetes Horizontal Pod Autoscaler (HPA) 테스트

  13. 13

    Android Kotlin은 다른 활동에서 함수를 호출합니다.

  14. 14

    C # HttpWebRequest 기본 연결이 닫혔습니다. 전송시 예기치 않은 오류가 발생했습니다.

  15. 15

    어떻게 같은 CustomInfoWindow 다른 이벤트를 할 수 있습니다

  16. 16

    rclone으로 원격 디렉토리의 모든 파일을 삭제하는 방법은 무엇입니까?

  17. 17

    dataSnapShot.getValue () 반환 데이터베이스에 그겁니다 데이터 종료 널 (null)

  18. 18

    ORA-12557 TNS : 프로토콜 어댑터를로드 할 수 없습니다

  19. 19

    JNDI를 사용하여 Spring Boot에서 다중 데이터 소스 구성

  20. 20

    다음 컨트롤이 추가되었지만 사용할 수 없습니다.

  21. 21

    C # Asp.net 웹 API-JSON / XML 변환기 API 만들기

뜨겁다태그

보관