2016-08-26 16 views
0

ImageButtonを持つ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時間を過ごし、私が陥る始めます。これに関するヒント?マーティン

答えて

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イベントハンドラ、あなたが編集行を検出するのと同じ方法で選択された行を検出することができます。

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

代替は中のImageButtonのVisibleプロパティを設定することです

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

注:トンのコンテンツをリフレッシュするために、あなたは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; 
} 
関連する問題