2010-12-07 4 views
0

내 GridView에 끔찍한 시간을 보내고 있습니다. 나는 미세한 빗으로 코드를 살펴 보았으므로 문제를 발견 할 수 없다.내 GridView가 간헐적으로 내 .net TemplateFields를 표시하지 않습니다.

저는 ASP.net GridView에 7 개의 열이 있습니다. 데이터는 SQL에서 가져옵니다. 두 개의 열은 사용자가 클릭하여 데이터베이스에서 항목을 제거하거나 수정할 수있는 javascript를 포함합니다. 다른 5 개의 필드에는 데이터베이스에있는 사람들의 이름, 전화 번호 및 전자 메일 주소가 들어 있습니다.

네 개의 필드는 ASP.net TemplateFields입니다.

페이지가로드되면 모든 것이 올바르게 표시됩니다. 그러나 사용자가 JavaScript 링크를 클릭하거나 GridView를 모든 필드로 정렬하기 위해 클릭하거나 포스트 백을 유발하는 다른 작업을 수행하면 결과 페이지에 내 TemplateFields의 내용이 표시되지 않을 수 있습니다. 그들은 모두 비어 있습니다. 내가 디버거에서 코드를 통해 단계 경우

<asp:TemplateField HeaderText="Name" SortExpression="name" ItemStyle-Width="150"> 
<ItemTemplate> 
<%#(string)Eval("surname") + ", " + (string)Eval("fname") %> 
</ItemTemplate> 
</asp:TemplateField> 

, 나는에서 볼 : 당신은 내가 함께 일하고 있어요 무엇을 볼 수

그냥, 그래서 나는 다음과 같이 정의 된 "이름"열이 템플릿 필드가 올바르게 표시되는 경우 이름을 표시하는 행에서 디버거가 중지됩니다. 필드가 모두 비어있는 경우 코드를 건너 뛰어 해당 필드의 내용을 표시합니다. 분명한 이유가 없기 때문에.

유일한 문제는 쿼리 문자열 (어떤 데이터를로드 할 것인지를 알려주는)에서 설정된 단일 열거 형 값이 있다는 것입니다. 열거 형 값을 1로 설정하면이 오류가 표시되지 않지만 열거 형 값을 2로 설정하면 항상 열어 보입니다.

그러나 열거 형은 내 gridview 코드에서 절대 참조되지 않습니다.

어떤 경우에도 GridView.DataSource = x가 항상 호출되며 GridView.DataBind()가 항상 호출됩니다. 나는 코드를 단계별로 실행하고 데이터베이스의 데이터가 올바른지 확인했다. DataBind가 호출 된 코드 블록과 GridViewRow_DataBound 이벤트 처리기에서 디버깅을 시도했습니다.

나는 TemplateField와 관련된 문제에 관해서는 다른 곳에서도 다른 곳을 보았습니다. 그러나 그 중 아무도 여기에서 무슨 일이 일어나고 있는지를 설명하지 못했습니다.

아이디어가 있으십니까?

+0

데이터가 채워진 데이터 소스로 각 포스트 백에서 gridview를 바인딩하고 있는지 확인하십시오. 비어 있지는 않습니다. – sam

+0

디버거를 사용하여 여러 번 확인했습니다. –

답변

0

나는 대답의 일부를 알아 냈다.

if (!userIsAllowedToSeePrivatePhoneNumbers) 
    removePrivatePhoneNumber(gridView); 
*** 
    protected void removePrivatePhoneNumber(GridView gridView) 
    { 
     DataControlField privatePhoneNumberColumn = null; 
     foreach (DataControlField column in gridView.Columns) 
     { 
      if (column.HeaderText.ToUpper() == "PRIVATE PHONE") 
       privatePhoneNumberColumn = column; 
     }    

     gridView.Columns.Remove(privatePhoneNumberColumn); 
    } 

가 나는 것을 발견 I false로 컬럼의 가시성을 설정하는 대신 제대로 내 데이터 디스플레이의 모든 열을 제거하는 경우 : 내가 좋아하는 읽는 몇 가지 코드를 발견했다. 나는 이것이 왜 존재 하는지를 이해하지 못하지만 지금 당장은 프로그램을 작동시키는 만족스러운 해결책이다.

protected void removePrivatePhoneNumber(GridView gridView) 
    { 
     DataControlField privatePhoneNumberColumn = null; 
     foreach (DataControlField column in gridView.Columns) 
     { 
      if (column.HeaderText.ToUpper() == "PRIVATE PHONE") 
       privatePhoneNumberColumn = column; 
     }    

     privatePhoneNumber.Visible = false; 
    } 
관련 문제