2016-12-29 1 views
2

ASPxGridView에는 DataItemTemplate이 포함 된 열이 포함되어 있는데,이 열은 ASPxCheckBox입니다. 그런 다음 체크 박스가 선택되었는지 여부에 따라 일부 동작을 수행하는 격자 외부에 단추가 있습니다. 그리드 같은 Page_Load 채워집니다ASPxGridView는 ASPxCheckBox를 사용하여 정렬 및 DataItemTemplate을 허용합니다.

<dx:ASPxGridView ID="grid" runat="server"> 
    <Columns> 
     <dx:GridViewDataColumn> 
      <DataItemTemplate> 
       <ds:ASPxCheckBox ID="checkbox" runat="server" /> 
      </DataItemTemplate> 
     </dx:GridViewDataColumn> 
    <Columns> 
</dx:ASPxGridView> 

:

그리드

는 다음과 같이 정의된다

protected void Page_Load(object sender, EventArgs e) 
{ 
    //Some stuff 
    grid.DataSource = sourceTable; 
    grid.DataBind(); 
    //Other stuff 
} 

sourceTable는 다음과 같이 정의되는 경우 :

public DataTable sourceTable 
{ 
    get 
    { 
     if (ViewState["sourceTable"] == null) 
      return new DataTable(); 
     return (DataTable)ViewState["sourceTable"]; 
    } 
    set 
    { 
     ViewState["sourceTable"] = value; 
    } 
} 

그리고 다른 곳에 채워집니다. (인구는 중요하지 않으며 작동하지 않습니다)

코드는 다양한 DevExpress 지원 항목에 정의 된대로 정렬 및 페이징이 올바르게 그리드에서 작동하도록 구현되었습니다. 이해할 수 있습니다. 우리는 버튼 클릭에 checkbox에서 Checked 값을 얻을려고 그러나, 그것은 항상 false입니다

protected void button_Click(object sender, EventArgs e) 
{ 
    //Some stuff 
    for(int i = 0; i < grid.VisibleRowCount; i++) 
    { 
     //Other stuff 
     ASPxCheckBox checkbox = grid.FindRowCellTemplateControl(i, grid.Columns[0], "checkbox") as ASPxCheckBox; 
     if(checkbox.Checked) //Always false 
     { 
      //Do conditional stuff 
     } 
     //More stuff 
    } 
    //Even more stuff 
} 

내가 그리드가 데이터를 리 바인드 및 기본 상태에있는 확인란을 재현으로이 항상 false입니다 이유를 이해 , DevExpress 상태에 관한 Page_Load의 데이터 바인딩을 랩으로 처리하는 if(!Page.IsPostBack)에있는이 문서에서 발견 한 모든 문서가 실제로 작동하지만 정렬 및 페이징이 중단됩니다.

나는 내가 한 다른 프로젝트에서 이것을위한 해결책을 가지고 있다고 확신한다. 나는 그것을 찾을 수 없다. 이 경우 어떻게해야합니까?

참고 : 코드를 최대한 짧게 만들었으므로 테스트 해보지 않았습니다. 실제 코드에는 약간의 오류가있을 수 있지만, 내가하려고하는 것에 대한 지침으로 사용하고 사람들이 겪을 수있는 문제를 명확히 할 것입니다.

편집 :이 조건이 Checked이 항상 false입니다 의미 제거, 그리드에 정렬 및 페이징 Page_Load 정지에 if(!Page.IsPostBack) 또는 if(!Page.IsCallback) 사용. 정렬/페이징 모두 발생해야하며 DataItemTemplateASPxCheckBoxChecked 값을 읽을 수 있어야합니다.

답변

2

답변 편집 C#에서 콜백 및 포스트 백 사이

if (!IsPostBack) 
     { 
      //Some stuff 

      grid.DataSource = sourceTable; 

      grid.DataBind(); 

      //Other stuff 
     } 

protected void ASPxGridView1_CustomCallback(object sender, DevExpress.Web.ASPxGridViewCustomCallbackEventArgs e) 
    { 
     for (int i = 0; i < grid.VisibleRowCount; i++) 
     { 
      //Other stuff 

      ASPxCheckBox checkbox = grid.FindRowCellTemplateControl(i, grid.DataColumns[0], "checkbox") as ASPxCheckBox; 

      if (checkbox.Checked) //Always false 

      { 

       //Do conditional stuff 

      } 

      //More stuff 

     } 
    } 

쇼 차이는

DataItemTemplate에서 편집기를 사용할 때 나타납니다 너는해야 해. 값을 얻으려면 LoadPostData()을 사용하십시오.

사용 :이 편집자에 영향을 미치지 않기 때문에

for(int i = 0; i < grid.VisibleRowCount; i++) 
{ 
    ASPxCheckBox checkbox = grid.FindRowCellTemplateControl(i, grid.Columns[0], "checkbox") as ASPxCheckBox; 

    ((IPostBackDataHandler)checkbox).LoadPostData(checkbox.UniqueID, Request.Form); 

    if(checkbox.Checked) 
    { 
     //Do conditional stuff 
    } 
} 

그리드를 채우기에 관해서는, 당신이 !IsPostBack없이 Page_Load 내부를 유지할 수 있습니다 (그리고 정렬/필터링을 유지합니다)

이 다른 경우에는 문제가 발생할 수 있지만 여기서는 그렇지 않습니다.

희망이 있습니다. 질문이 있으면 알려주세요.

+0

나는 이것을 시도했지만 여전히 작동하지 않습니다. 테스트에서'button_Click'' grid.VisibleRowCount' = 2, for 루프로 들어가서'ASPxCheckBox checkbox = grid.FindRowCellTemplateControl (i, grid.Columns [0], "체크 박스)]를 ASPxCheckBox로 설정하면'null'입니다. . 'grid.VisibleRowCount'를 다시 검사하면 0이됩니다. 왜 이런 일이 생길까요? – anothershrubery

+0

좋아, 이건 Valeh의 솔루션에 동일한 문제가있는 것 같습니다. 'button_Click'에서 페이지가 다시 게시되고 따라서 데이터에 리바운드되지 않으므로'grid.FieldRowCellTemplateControl'은'grid.GetDataRow'처럼 널을 반환합니다. 이것은 다소 짜증이 날 것입니다. – anothershrubery

+0

Valeh의 솔루션과는 아무런 관련이 없습니다. 포스트 그리드에서 모든 그리드 데이터를 사용할 수 있습니다 (이전 그리드 데이터는 다시 채워지지 않습니다). 예를 들어 왜 'VisibleRowCount'를 가지고 있는지.클라이언트로 다시 보내면 값을 유지할 수 없기 때문에 그리드를 다시 채우지 않고 데이터를 서버로 다시 전달할 때 문제가 발생합니다. 나는 왜 당신이 체크 박스를 null로 가져올 지 확신하지 못한다. 그러나 나는 그 또 다른 문제라는 느낌을 가지고있다. 곧 살펴 보겠습니다. –

0

버튼을 클릭하면 서버에 페이지 게시가 이루어지고 서버에 게시하는 모든 페이지가 기본값으로 설정됩니다 (제어하지 않으면 isPostBack 속성). 당신은 그리드 컨트롤 정렬 클라이언트 측에서 일을. 서버 측에 게시하고 클라이언트 측에 렌더링하면 정렬이 제거됩니다. 콜백을 사용할 수 있습니다. 예 :

<dx:ASPxGridView ID="grid" runat="server" ClientInstanceName="grid" OnCustomCallback="ASPxGridView1_CustomCallback"> 
      <Columns> 
       <dx:GridViewDataColumn> 
        <DataItemTemplate> 
         <dx:ASPxCheckBox ID="checkbox" runat="server" /> 
        </DataItemTemplate> 
       </dx:GridViewDataColumn> 
      </Columns> 
    </dx:ASPxGridView> 


<dx:ASPxButton ID="btnSend" runat="server" AutoPostBack="False" Text="Send" Width="100px" ClientInstanceName="btnSend"> 
<ClientSideEvents Click="function(s, e) { grid.PerformCallback(); }" /> 
</dx:ASPxButton> 

코드 뒤에 : Difference between a Postback and a Callback

+0

곧이 테스트를하지만, 이것이 여전히 정렬 휴식 것입니다 저를 친다? 데이터 소스가 페이지로드에 바인딩되어 있지 않으므로? 실제로는 버튼이 포스트 백을하지 않기 때문에 버튼을 사용할 수 없으므로'button_Click' 코드를 실행하지 않습니다. – anothershrubery

+0

편집이 더 좋습니다. 그러나 정렬이 여전히 부러지는 것처럼 느껴집니다. – anothershrubery

+0

checkBox 열이나 다른 열을 정렬 하시겠습니까? –

0

일부 변형이 있습니다.

후 Page_Init 이벤트 핸들러

당신은 Page_Init 이벤트 처리기에 바인딩 코드를 이동하려고 할 수 있습니다. CheckBox 편집기의

protected void Page_Init(object sender, EventArgs e) 
{ 
    grid.DataSource = sourceTable; 
    grid.DataBind(); 
} 

PostDataPage_InitPage_Load 사이로드, 그래서 당신의 CheckBox 열의 값은 grid.DataBind 방법으로 호출 한 후 Page_Load 이벤트에서 삭제 될 것입니다. = "true"를 ShowSelectCheckbox와


GridViewCommandColumn 여기

은 또 다른 가능성이다. GridViewCommandColumnShowSelectCheckbox 속성을 사용하여 원하는 동작을 모방 할 수 있습니다.

<dx:GridViewCommandColumn ShowSelectCheckbox="true" /> 

당신은 확인 행을 얻을 수 grid.Selection.IsRowSelected 방법을 사용할 수 있습니다. 여기
은 예입니다

protected void Button1_Click(object sender, EventArgs e) 
{ 
    //Some stuff 
    for (int i = 0; i < grid.VisibleRowCount; i++) 
    { 
     //Other stuff     
     if (grid.Selection.IsRowSelected(i)) 
     { 
      //Do conditional stuff 
     } 
     //More stuff 
    } 
    //Even more stuff 
} 
+0

'Page_Init'은 정렬/페이징을 위해 다시 채워지지 않기 때문에 작동하지 않습니다. 'GridViewCommandColumn'은 그 안에'ASPxCheckbox' 이상을 갖는'DataItemTemplate'이며 비슷한 여러개의 컬럼이 있기 때문에 적합하지 않습니다. 방금 코드를 단순화했습니다. – anothershrubery

+0

@anothershrubery 상황을 재현 할 수 없습니다. 내 테스트 프로젝트에서'Page_Init'은 정렬/페이징을 위해 다시 채워 넣습니다. – nempoBu4

+0

@anothershrubery 어쨌든, Jaqen Hghar [답변] (http://stackoverflow.com/a/41446795/1805640)에서 언급 한'LoadPostData' 메소드가 효과적입니다. – nempoBu4