3

私は運がなくてもいくつかの同様の質問を見てきました。私がやりたいのは、特定のアイテムにはリンクボタンを表示し、他のアイテムにはハイパーリンクを表示するグリッドビューを用意することです。これは私が現在持っているコードです:

public void gv_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        var data = (FileDirectoryInfo)e.Row.DataItem;
        var img = new System.Web.UI.HtmlControls.HtmlImage();
        if (data.Length == null)
        {
            img.Src = "/images/folder.jpg";
            var lnk = new LinkButton();
            lnk.ID = "lnkFolder";
            lnk.Text = data.Name;
            lnk.Command += new CommandEventHandler(changeFolder_OnCommand);
            lnk.CommandArgument = data.Name;
            e.Row.Cells[0].Controls.Add(lnk);
        }
        else
        {
            var lnk = new HyperLink();
            lnk.Text = data.Name;
            lnk.Target = "_blank";
            lnk.NavigateUrl = getLink(data.Name);
            e.Row.Cells[0].Controls.Add(lnk);
            img.Src = "/images/file.jpg";
        }
        e.Row.Cells[0].Controls.AddAt(0, img);
    }
}

ここで、最初のセルは TemplateField です。現在、すべてが正しく表示されますが、リンク ボタンは Command イベント ハンドラーを発生させず、ポストバック時にすべてのコントロールが消えます。

何か案は?

4

3 に答える 3

3

ポストバックに GridView の再バインドを強制する必要があると思います。これにより、すべての動的コントロールが再作成され、それらのイベント ハンドラーが再アタッチされます。これにより、ポストバック後の消失も防ぐことができます。

IOW、DataBind()ポストバック時に GridView を呼び出します。

于 2009-06-24T16:37:56.483 に答える
1

これらを Row_Created イベントに追加することもできます。その後、!PostBack チェックを元に戻す必要はありません。

于 2010-04-11T23:18:50.307 に答える
0

ボタンを宣言的に作成し、(リテラル コントロールを使用して) 宣言的にハイフンを作成してから、データ バインディング構文を使用して、必要に応じてコントロールの Visible プロパティである可視性を true または false に設定してみませんか。

Visible='<%#((FileDirectoryInfo)Container.DataItem).Length == null) %>' 

そんな感じ。

于 2009-06-24T22:01:19.727 に答える