ASP.NET GridViewコントロールを使用すると、PageIndExchanged後にGridViewRowでコントロールまたは個々のセルを無効にするにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/3963603

質問

データバインドされたGridViewコントロールがあり、ユーザーの役割に基づいて個々のセルを無効にすることができます。これは最初のページでのみ動作します。

private void LimitAccessToGridFields()
    {
        if (User.IsInRole("Processing")) return;

        foreach (GridViewRow gridViewRow in gvScrubbed.Rows)
        {
            var checkBox = ((CheckBox) gridViewRow.FindControl("cbScrubbed"));
            checkBox.Enabled = false;

            // ButtonField does not have an ID to FindControl with
            // Must use hard-coded Cell index
            gridViewRow.Cells[1].Enabled = false; 
        }
    }

この方法は、page_loadで動作する場所で呼び出します。 PageIndExchagingとPageIndExexhedイベントハンドラーで試してみましたが、機能しません。デバッグ中、行の両方のコントロールでfalseに有効になっていることに成功したようです。私の目標は、ページを変更した後、ユーザーの役割に応じてこれらのフィールドを無効にすることです。これはどのように達成されるべきですか?

役に立ちましたか?

解決 2

これは、Rowdataboundイベントハンドラーで行う必要があることがわかりました。

if (e.Row.RowType == DataControlRowType.DataRow)
{
   // details elided ...

   // Limits the access to grid fields.
   if (!User.IsInRole("PROCESSING"))
   {
       cbstuff.Enabled = false; // a checkbox
       e.Row.Cells[1].Enabled = false; //a link button
   }
}

他のヒント

コントロールを無効にしたり、隠したり見えるようにコントロールを繰り返す必要はありません。

GridViewコントロール内のすべてのセルは、実際にはHTMLテーブルリファレンスです。

それでは、すべてのセルを繰り返して、各セル内に見つかったコントロールを繰り返して、それらを無効にするだけですか?または、グリッドビューの各行をループして直接無効または非表示にするだけで、行内のすべてに影響します。

テーブルセルの参照を使用して隠す例:

foreach (GridViewRow gRow in myGridView.Rows)
            {
                if (gRow.RowType == DataControlRowType.DataRow)
                {
                        TableCellCollection tbcCol = (TableCellCollection)gRow.Cells;
                        foreach (TableCell tblCell in tbcCol)
                                tblCell.Enabled = false;
                }
            }

そのため、テーブルセルごとにすべてのテーブルセルが無効になります。

または..なぜ行全体を無効にしないのですか?

foreach (GridViewRow gRow in myGridView.Rows)
            {
                if (gRow.RowType == DataControlRowType.DataRow)
                   gRow.Enable = false;
            }

特定のコントロールタイプ(チェックボックス、テキストボックス、ラベルなど)をピン留めまたはフィルタリングする必要があり、それらのコントロールのみにのみ影響する場合は、単にテストしてください!

foreach (GridViewRow gRow in myGridView.Rows)
{
  if (gRow.RowType == DataControlRowType.DataRow)
  {
     TableCellCollection tbcCol = (TableCellCollection)gRow.Cells;
     foreach (TableCell tblCell in tbcCol)
         if (((TextBox)tblCell) != null)
             ((TextBox)tblCell).Enable = false;
  }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top