【问题标题】:asp.net set command argumentasp.net 设置命令参数
【发布时间】:2023-03-07 02:20:01
【问题描述】:

我正在使用 OnRowDataBound 自动将链接按钮添加到我的网格视图中,如下所示。我遇到的问题是设置命令参数。

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

下面是添加链接的代码。我将命令参数设置为 Eval("Value") 但这不起作用。 Here is a link to the original code that I'm trying to change so it is dynamic.

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);
    }

【问题讨论】:

    标签: asp.net commandargument


    【解决方案1】:

    RowDataBound 不是动态添加控件的正确事件,因为它们需要在每次连续回发时重新创建。仅当您调用GridView.DataBind() 时才会触发RowDataBound

    所以改用RowCreated,但在RowDataBound 中分配CommandArgument 值,不要使用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 更改为您可以从调试器获取的实际数据源。

    编辑:正如评论所言,它是ListItem,您想使用它的Value 属性:

    var item = (ListItem) e.Row.DataItem;
    lnkView.CommandArgument = item.Value;
    

    【讨论】:

    • 我正在使用 DataBind。正在创建链接,只是它们不起作用。我只是一个初学者,从你的例子中我仍然不明白我需要做什么。
    • 我想我现在理解得更好了。所以有了这部分 (DataRowView)e.Row.DataItem; “DataRowView”是否需要成为我的数据源?
    • @Laserchalk:是的,它是您数据源中的单条记录。如果您将DataTable 用作DataSource,则它是DataRowView。如果您使用不同的来源,则需要更改类型。但是你不明白什么?您是否注册了事件处理程序OnRowCreated 并在那里创建了链接?发生了什么?
    • @Time Schmelter 我认为我不需要 OnRowCreated,因为我使用的是 DataBind。事实证明,我需要将 DataRowView 更改为 ListItem 类型。该行不起作用,它说'System.Web.UI.WebControls.ListItem'不包含'Row'的定义。如果我使用列表项,我猜我需要使用不同的东西?
    • @Laserchalk:通常您不需要在每次回发时对网格进行 DataBind。只有在刷新源代码时才需要它(例如,如果您使用 PagingSorting)。如果它是ListItem,则相应地投射它并使用它的Value 属性。我已经编辑了答案。
    猜你喜欢
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    • 2017-10-22
    • 2019-09-20
    • 2012-02-24
    • 2011-05-02
    • 2021-12-02
    • 1970-01-01
    相关资源
    最近更新 更多