65.9K
CodeProject 正在变化。 阅读更多。
Home

通过 CommandArgument 值访问 GridView 中的单个单元格数据

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (1投票)

2007年9月12日

CPOL

3分钟阅读

viewsIcon

75227

downloadIcon

254

在 RowDataBound 时设置 GridView 单元格的 CommandArgument 值。

引言

前几天我遇到了一个问题,需要捕获在 GridView 中被点击单元格的值。 默认情况下,RowCommand 包含 CommandArgument 中的 RowIndex,但是无法知道哪个列触发了该事件。 解决方案是在绑定 GridView 的行时,在运行时设置单元格的 CommandArgument 值。 本文将向您展示如何以一种非常快速和简单的方式执行此操作。

背景

感谢 forum.asp.net,通过在 RowDataBound 事件期间设置单元格的 CommandArgument,我被指引了正确的方向。 当然,问题是…如何做? 直到偶然我才找到了现在要介绍的解决方案。

应用程序

我将使用一个非常小的应用程序来演示如何执行此操作。 该应用程序借助 XmlDataSource 对象显示来自 XML 文件的音乐组的数据。 我永远不会在实际应用程序中使用这些 DataSource 对象,但它们非常适合在几分钟内将某些内容组合在一起以进行原型设计。 数据存在乐队名称和四个成员。 单击成员时,其名称将显示在 GridView 上方的标签中。

Screenshot - CommandArgument.jpg

我不会深入研究如何将 XML 文件绑定到 GridView。 互联网上有很多文章处理这个主题。 我将只向您展示此 GridViewRowDataBoundRowCommand 事件处理程序。(我也发现,当您真正需要它们时,找到四个成员的乐队有多么困难。)

要运行示例,请下载源代码,打开项目文件,然后通过 Visual Studio 2005 运行它。

RowDataBound

每当 GridView 的一行绑定到数据时,都会触发 RowDataBound 事件。 这是一个很好的地方,可以在将数据显示给用户之前对数据进行一些最后的更改。

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        ((LinkButton)e.Row.Cells[1].Controls[0]).CommandArgument =
            ((LinkButton)e.Row.Cells[1].Controls[0]).Text;
        ((LinkButton)e.Row.Cells[2].Controls[0]).CommandArgument =
            ((LinkButton)e.Row.Cells[2].Controls[0]).Text;
        ((LinkButton)e.Row.Cells[3].Controls[0]).CommandArgument =
            ((LinkButton)e.Row.Cells[3].Controls[0]).Text;
        ((LinkButton)e.Row.Cells[4].Controls[0]).CommandArgument =
            ((LinkButton)e.Row.Cells[4].Controls[0]).Text;
    }
}

上面的代码首先检查该行是否为 'DataRow' 类型。 接下来,我们导航到该行的不同单元格,并将第一个控件转换为 LinkButton。 此转换非常重要,具体取决于您在 GridView 中使用的按钮类型。 如果将类型设置为“button”,则需要将控件转换为 Button。 在我的例子中,我使用“link”类型,所以我必须将其转换为 LinkButton 控件。 将其转换为正确的控件后,您可以毫无问题地将 CommandArgument 属性设置为 Text 值,如上所示。

RowCommand

设置 CommandArgument 后,唯一要做的就是单击链接时检索它。 单击链接会触发一个普通的 RowCommand 事件,但是现在,您会发现 CommandArgument 不是行索引,而是被单击单元格的文本。 当然,您需要将所有 ButtonFieldCommandName 设置为相同的名称。 接下来,您只需像往常一样使用 RowCommand,如下所示

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
    if (e.CommandName == "ShowMember")
    {
        lblResult.Text = "You clicked Member '" + e.CommandArgument.ToString() + "'";
    }
}

结论

正如您所看到的,一个非常简单的解决方案,不幸的是,我花了将近一整天的时间才弄清楚。 当然,这包括等待来自美国的回复。 为什么那些家伙总是当我们醒着的时候睡觉?? 我最大的问题是在绑定行时访问控件和 CommandArgument 属性。 实际上,我尝试将其转换为 ButtonField,直到(我仍然不知道为什么)我突然打错了字,并将其转换为 LinkButton。 当然,现在这一切对我来说都很有意义。 根据您在 GridView 中选择的按钮类型,这就是在运行时生成的控件类型,并且在引用它时需要使用。 这一发现对我在当前项目中帮助很大,我希望它也能帮助那些遇到这篇文章的人。 这是我向 The Code Project 提交的第一篇文章。 多年来,这已成为我的主要资源之一,因此我认为是时候回馈(或至少尝试一下)了。

© . All rights reserved.