0

OnRowDataBound を使用して、このようなリンク ボタンをグリッド ビューに自動的に追加しています。私が抱えている問題は、コマンド引数の設定です。

<asp:LinkButton ID = "lnkDelete" Text = "Delete" CommandArgument = '<%# Eval("Value") %>' runat = "server" OnClick = "DeleteFile" />

以下は、リンクを追加するコードです。コマンド引数を Eva​​l("Value") に設定しましたが、うまくいきません。これは、動的になるように変更しようとしている元のコードへのリンクです。

protected void OnRowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        LinkButton lnkView = new LinkButton();
        lnkView.ID = "lnkDelete";
        lnkView.Text = "Delete";
        lnkView.Click += DeleteFile;
        lnkView.CommandArgument = Eval("Value");
        e.Row.Cells[1].Controls.Add(lnkView);
    }
4

1 に答える 1

1

RowDataBound連続するポストバックごとに再作成する必要があるため、コントロールを動的に追加するのに適切なイベントではありません。RowDataBoundを呼び出した場合にのみトリガーされますGridView.DataBind()

RowCreated代わりに使用しますが、CommandArgument値を割り当ててRowDataBound使用しないでください。Eval("Value")実際のデータソースから取得しe.Row.DataItemます。

このようなものが動作するはずです:

protected void OnRowCreated(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        LinkButton lnkView = new LinkButton();
        lnkView.ID = "lnkDelete";
        lnkView.Text = "Delete";
        lnkView.Click += DeleteFile;
        e.Row.Cells[1].Controls.Add(lnkView);
    }
}

protected void OnRowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        LinkButton lnkView = (LinkButton)e.Row.FindControl("lnkDelete");
        var rowView = (DataRowView)e.Row.DataItem;
        lnkView.CommandArgument = rowView.Row.Field<string>("Value");
    }
}

これが実行時に例外をスローする場合(DataRowView)e.Row.DataItemは、デバッガーから取得できる実際のデータソースに変更する必要があります。

編集:コメントされているように、それは a であり、そのプロパティListItemを使用したい:Value

var item = (ListItem) e.Row.DataItem;
lnkView.CommandArgument = item.Value;
于 2015-01-27T10:57:50.183 に答える