2016-12-29 9 views
2

ASPxGridViewにはDataItemTemplateの列にASPxCheckBoxが含まれています。私は、チェックボックスがオンになっているかどうかに基づいていくつかのアクションを実行するグ​​リッドの外にボタンを持っています。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> 

グリッドなどPage_Loadに移入され:

sourceTableのように定義される
protected void Page_Load(object sender, EventArgs e) 
{ 
    //Some stuff 
    grid.DataSource = sourceTable; 
    grid.DataBind(); 
    //Other stuff 
} 

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

他の場所移入します。

コードは、さまざまなDevExpressサポートトピックで定義されているように、ソートとページングがグリッド上で正しく機能するように実装されています。これは理解できる。私たちは、ボタンのクリックにcheckboxからChecked値を取得しようとすると、しかし、それは常に偽です:

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 
} 

グリッドはデータを再バインドし、デフォルトの状態にあるチェックボックスを再作成して、これは常に偽である理由を私は理解して、私はDevExpressの状態に関するPage_Loadif(!Page.IsPostBack)のデータバインディングをラップするこの問題のために見つけたドキュメントは、実際に動作しますが、並べ替えとページングを中断します。

私が行った他のプロジェクトでこれを解決する方法があると確信しています。私はそれを見つけることができません。この場合、何をすべきか?

注:コードをできるだけ少なくしてテストしていないほど、コードを短くしました。実際のコードには小さな誤りがあるかもしれませんが、私がしようとしていることの目安として使用し、人々が遭遇する可能性のある問題を明確にします。

編集:if(!Page.IsPostBack)またはif(!Page.IsCallback)Page_Loadに設定すると、グリッドの並べ替えとページングが停止するため、この条件を削除すると、Checkedは常にfalseになります。私は並べ替え/ページングの両方が発生し、DataItemTemplateASPxCheckBoxCheckedの値を読み取ることができるようにする必要があります。

答えて

2

編集答え

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として実行すると ''ヌルです。 'grid.VisibleRowCount'をもう一度チェックして、今は0です。なぜこれが起こるのでしょうか? – anothershrubery

+0

これは、Valehのソリューションと同じ問題があるようです。 'button_Click'では、ページが返送されてデータにリバウンドしないので、' grid.FindRowCellTemplateControl'は 'grid.GetDataRow'と同様にnullを返します。これはむしろ迷惑に見えています。 – 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> 

コードの背後にある:

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 

     } 
    } 

C#でのコールバックとポストバックの間にショー差 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イベントで消去しようとしています。


ここShowSelectCheckbox

= "true" を持つ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

関連する問題