2016-08-26 3 views
0

GridView에 선택한 행에 대해서만 표시되어야하는 ImageButton이 있습니다. OnRowDataBound 이벤트에서이 작업을 수행하지만 작동하지 않습니다.RowDataBound가 예상대로 작동하지 않습니다.

protected void OnRowDataBoundMS(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     if ((e.Row.RowState & DataControlRowState.Edit) > 0) 
     { 
      // some working code that handles the edit mode 
     } 
     else if (Gridview1.SelectedValue != null) 
     { 
      ImageButton ImgBut1 = e.Row.FindControl("ButtonUp") as ImageButton; 
      ImgBut1.Visible = true; 
     } 
    } 
} 

내있는 gridview는 다음과 같습니다

<asp:GridView runat="server" 
        ID="Gridview1" 
        DataSourceID="Milestones" 
        DataKeyNames="ID" 
        AutoGenerateColumns="false" 
        OnRowEditing="OnRowEditing" 
        OnRowDataBound="OnRowDataBoundMS" 
        OnSelectedIndexChanged="OnSelectedIndexChangedMS"> 
    ... 
     <asp:templatefield HeaderText="Order" ItemStyle-HorizontalAlign="center"> 
      <ItemTemplate> 
       <asp:ImageButton ID="ButtonUp" runat="server" OnClick ="OrderUp" ImageUrl="img/up.png" Visible="false"/> 
      </ItemTemplate> 
     </asp:templatefield> 

나는이의 마지막 3 시간 동안 나는 흥분하기 시작합니다. 이것에 대한 어떤 힌트?

if ((e.Row.RowState & DataControlRowState.Selected) != 0) 
{ 
    ... 
} 

대안이있는하여 ImageButton의 Visible 속성을 설정하는 것입니다 : 마틴

답변

2

다른 대안은 당신이 선택 명령 옵션을 사용하는 경우 SelectedIndexChanged event를 사용하는 것입니다 : 그런

protected void OnSelectedIndexChangedMS(object sender, EventArgs e) 
{ 
    foreach (GridViewRow row in GridView1.Rows) 
    { 
     Control ctl = row.FindControl("ButtonUp"); 
     ctl.Visible = (row.RowState & DataControlRowState.Selected) != 0; 
    } 
} 

뭔가; 선택한 인덱스가 업데이트되기 전에 RowDataBound가 실행될 수 있습니다 (확실하지는 않습니다 ...).

+0

'SelectedIndexChanged'에서 그것을하는 것이 내 대답보다 효율적입니다. 그러나 귀하의 답변에 대한 수정을 제안하고자합니다 (그러나 귀하의 승인없이 편집이 적용될 수 있습니다). – ConnorsFan

+0

원본을보고 편집 할 수 있도록 편집이 버전으로되어 있으므로 –

+0

선택한 색인보다 먼저 RowDataBound 발사에 대한 힌트를 주셔서 감사합니다. – Barnabeck

2

당신은 RowState 재산, 당신은 편집 행을 감지 같은 방법으로 RowDataBound 이벤트 처리기에서 선택한 행을 검색 할 수 있습니다

<asp:ImageButton runat="server" Visible='<%# ((Container as GridViewRow).RowState & DataControlRowState.Selected) != 0 %>' ... /> 

참고 : t의 내용을 갱신하기 위해, 당신은 SelectedIndexChanged 이벤트 처리기에서 GridView1.DataBind()를 호출하는지 확인 데이터 바인딩 식으로 마크 업, 그는 GridView.

+0

고맙습니다. 두 가지 대안을 시도해 보았지만 설득력을 얻지 못했지만 효과가 없었습니다. RowDataBound가 Brian이 이전에 발사했기 때문에 가능성이 가장 높습니다. – Barnabeck

0

내가 선택한 핵심 색인이 업데이트되기 전에 Brian Mains가 RowDataBound 실행에 대해 말한 내용이 핵심 메모라고 생각합니다. 나는 이것이 일반적으로 옳다는 것을 증명할 수는 없지만 그렇게 보입니다. 그러므로 ConnersFan의 제안을 따르더라도 모든 시도는 효과가 없었습니다. Brian이 제안한 것과 SelectedIndexChanged 이벤트 처리기를 사용했지만 모든 행을 반복하지 않았습니다. 해결책은 실제로 매우 간단합니다.

protected void OnSelectedIndexChangedMS(object sender, EventArgs e) 
{ 
    Gridview1.DataBind(); 
    ImageButton ImgBut1 = Gridview1.SelectedRow.FindControl("ButtonUp") as ImageButton; 
    ImgBut1.Visible = true; 
} 
관련 문제