0

私はGridViewを持っています...

<asp:GridView EnableViewState="true" 
                ID="grdResults" 
                runat="server" 
                CssClass="resultsGrid" 
                OnRowDataBound="grdResults_OnRowDataBound" 
                AutoGenerateColumns="false" 
                HeaderStyle-CssClass="header" 
                OnRowCommand="grdResults_OnRowCommand">
    <Columns>
       <asp:TemplateField>
           <ItemTemplate>
               <asp:Label ID="lblView" 
                           runat="server" 
                           Visible="false" 
                           Text="View">
               </asp:Label>
               <asp:HyperLink ID="hypEdit" 
                               runat="server" 
                               Visible="false" 
                               Text="(Edit)" 
                               CssClass="edit">
               </asp:HyperLink>
               <asp:LinkButton ID="btnDelete" 
                               runat="server" 
                               Visible="false" 
                               Text="(Delete)" 
                               CssClass="delete" 
                               CommandName="DeleteItem" 
                               OnClientClick="return confirm('Are you sure you want to delete?')">
               </asp:LinkButton>
               <asp:HyperLink ID="hypSelect" 
                               runat="server" 
                               Visible="false" 
                               Text="(Select)" 
                               CssClass="select">
               </asp:HyperLink>
           </ItemTemplate>
       </asp:TemplateField>
   </Columns>
</asp:GridView>

これには、ラベル 2 つのハイパーリンクとリンク ボタンを含む 1 つの静的な列があり、動的に生成された多数の列もあります...

private void SetupColumnStructure(IEnumerable<string> columnNames)
{
    var columnNumber = 0;
    foreach (var columnName in columnNames)
    {
        var templateColumn = new TemplateField
                                 {
                                     ItemTemplate = new CellTemplate(columnName)
                                 };
       grdResults.Columns.Insert(columnNumber, templateColumn);
       columnNumber++;
    }
}

OnRowDataBound ハンドラーの一部として、静的列のコントロールの 1 つを取得し、いくつかの属性を設定します...

protected void grdResults_OnRowDataBound(object sender, GridViewRowEventArgs e)
{
    .
    .
    .
    var row = e.Row;
    var rowData = row.DataItem as Dictionary<string, object>;
    if (rowData != null)
    {
       if ((bool)rowData[displayEditLink])
       {
           var hypEdit = (HyperLink)row.FindControl("hypEdit");
           hypEdit.NavigateUrl = "~/Pages/Edit.aspx?action=Edit&objectType=" + rowData[objectTypeLiteral] + "&id=" + rowData[objectIdLiteral];
           hypEdit.Visible = true;
       }
   }
   .
   .
   .
}

これはすべて正常に機能しますが、列名は表示されません。次に、SetupColumnStructure メソッドを変更して、HeaderText がテンプレート フィールドに次のように設定されるようにします...

private void SetupColumnStructure(IEnumerable<string> columnNames)
{
    var columnNumber = 0;
    foreach (var columnName in columnNames)
    {
        var templateColumn = new TemplateField
                                 {
                                     ItemTemplate = new CellTemplate(columnName),
                                     HeaderText = columnName
                                };
       grdResults.Columns.Insert(columnNumber, templateColumn);
       columnNumber++;
    }
}

何らかの理由で、この 1 行の余分な変更により、row.FindControl("hypEdit"); が発生します。OnRowDataBound ハンドラーで呼び出して null を返します。誰かがここに欠けているものを見ることができますか、または誰かが同様の問題を経験しましたか?

アップデート

ここでは、ヘッダー行またはフッター行を参照していないことを確認しました。また、オブジェクト参照例外をステップ オーバーすると、DataSource 内のすべての項目でこれが発生します。

これが役立つかどうかはわかりませんが、予想どおり、コードをステップ実行すると、テーブルは予想されるすべての列を生成しましたが、すべてのセル (DataControlFieldCells) には、HeaderText が設定されている場合はコントロールが含まれていませんが、設定されていない場合はすべての予想されるコントロールが含まれています。

すべて非常に奇妙です。他に何かわかることがあれば教えてください。

4

2 に答える 2

0

HeaderText を追加すると、新しい RowType がグリッドビューに追加されました。OnRowDataBound イベントを発生させた行の種類を確認し、適切なアクションを実行する必要があります。あなたの場合、 e.Row.RowType が DataRow であるかどうかを確認するだけで問題が解決するはずです:

protected void grdResults_OnRowDataBound(object sender, GridViewRowEventArgs e)
{
     if(e.Row.RowType == DataControlRowType.DataRow)
     {
          if ((bool)rowData[displayEditLink])
          {
           var hypEdit = (HyperLink)row.FindControl("hypEdit");
           hypEdit.NavigateUrl = "~/Pages/Edit.aspx?action=Edit&objectType=" + rowData[objectTypeLiteral] + "&id=" + rowData[objectIdLiteral];
           hypEdit.Visible = true;
          }
     }
}
于 2009-02-04T15:11:31.847 に答える
0

検索しているコントロールが別のコントロールに含まれているためです。FindControl() は、コントロールのコントロール コレクション内を検索しません。recursiveFindControl() メソッドを記述する必要があります。

これが少し役立つことを願っています!

于 2009-04-22T17:51:11.623 に答える