0

私は GridView でひどい時間を過ごしています。コードを細かく調べてみましたが、問題が見つかりません。

7 つの列を持つ ASP.net GridView があります。データは SQL から取得されます。2 つの列には、ユーザーがクリックしてデータベースのエントリを削除または変更できる JavaScript が保持されます。他の 5 つのフィールドには、データベース内の人物の名前、電話番号、および電子メール アドレスが含まれています。

私のフィールドの 4 つは ASP.net TemplateFields です。

ページが読み込まれると、すべてが正しく表示されます。ただし、ユーザーが JavaScript リンクをクリックしたり、クリックして任意のフィールドで GridView を並べ替えたり、ポストバックを引き起こすその他のアクションを実行したりすると、結果のページに TemplateFields のコンテンツが表示されない場合があります。それらはすべて空白です。

私が何を扱っているかを見ることができるように、次のように定義された「名前」列があります。

<asp:TemplateField HeaderText="Name" SortExpression="name" ItemStyle-Width="150">
<ItemTemplate>
<%#(string)Eval("surname") + ", " + (string)Eval("fname")  %>
</ItemTemplate>
</asp:TemplateField>

デバッガーでコードをステップ実行すると、テンプレート フィールドが正しく表示されている場合でも、名前が表示されている行でデバッガーが停止することがわかります。フィールドがすべて空白の場合、コードを飛び越えてそれらのフィールドの内容を表示します。そして、識別可能な理由はありません。

問題の原因と思われる唯一のことは、クエリ文字列から設定された単一の列挙値があることです (ページにロードするデータを伝えます)。列挙値が 1 に設定されている場合、このエラーは表示されませんが、列挙値が 2 に設定されている場合は常に表示されるようです。

ただし、列挙型は私の gridview コードのどこでも参照されることはありません。

いずれにせよ、GridView.DataSource = x は常に呼び出され、GridView.DataBind() は常に呼び出されます。コードをステップスルーして、データベースからのデータが正しいことを確認してみました。DataBind が呼び出されるコード ブロックと GridViewRow_DataBound イベント ハンドラーでデバッグを試みました。

TemplateField のトラブルに関する他の投稿を見たことがありますが、ここで起こっていることに対処しているようには見えません。

何か案は?

4

1 に答える 1

0

答えの一部を理解しました。次のようなコードを見つけました。

if (!userIsAllowedToSeePrivatePhoneNumbers)
    removePrivatePhoneNumber(gridView);
***
    protected void removePrivatePhoneNumber(GridView gridView)
    {
        DataControlField privatePhoneNumberColumn = null;
        foreach (DataControlField column in gridView.Columns)
        {
            if (column.HeaderText.ToUpper() == "PRIVATE PHONE")
                privatePhoneNumberColumn = column;
        }            

        gridView.Columns.Remove(privatePhoneNumberColumn);
    }

列を削除するのではなく、列の可視性を false に設定すると、すべてのデータが正しく表示されることがわかりました。これがなぜなのかはわかりませんが、今のところプログラムを機能させるには満足のいく解決策です。

    protected void removePrivatePhoneNumber(GridView gridView)
    {
        DataControlField privatePhoneNumberColumn = null;
        foreach (DataControlField column in gridView.Columns)
        {
            if (column.HeaderText.ToUpper() == "PRIVATE PHONE")
                privatePhoneNumberColumn = column;
        }            

        privatePhoneNumber.Visible = false;
    }
于 2010-12-08T15:34:00.173 に答える