如何在ASP.NET GridView中基于DataKey设置选定的行?

时间:2008-12-08 18:50:34

标签: asp.net gridview

我想要类似下面的伪代码:

myGridView.SelectedIndex = myGridView.DataKeys.IndexOf("mySpecificKey");

我已经做了一些Intellisense探索,但我还没有找到一个明显的方法来做到这一点。如果找不到DataKey,我想将SelectedIndex设置为-1。

9 个答案:

答案 0 :(得分:9)

我最终得到了

        For n As Integer = 0 To myGridView.DataKeys.Count - 1
            If myGridView.DataKeys(n).Value = myKeyObj Then
                myGridView.SelectedIndex = n
            End If
        Next

答案 1 :(得分:5)

您是否考虑过Linq方法?

用法:

GridView1.SelectedIndex = GridView1.DataKeys.IndexOf(id);

代码:

public static class WebControlsEx
{
    public static int IndexOf(this DataKeyArray dataKeyArray, object value)
    {
        if (dataKeyArray.Count < 1) throw new InvalidOperationException("DataKeyArray contains no elements.");
        var keys = dataKeyArray.Cast<DataKey>().ToList();
        var key = keys.SingleOrDefault(k => k.Value.Equals(value));
        if (key == null) return -1;
        return keys.IndexOf(key);
    }
}

答案 2 :(得分:4)

这很有效,很简短:

        int MyId = 22;

        foreach (GridViewRow gvRow in gridview1.Rows)
        {
            if ((int)gridview1.DataKeys[gvRow.DataItemIndex].Value == MyId)
            {
                gridview1.SelectedIndex = gvRow.DataItemIndex;
                break;
            }
        }

答案 3 :(得分:3)

如果启用了分页,则上述方法仅搜索GridView的当前页面。要搜索整个GridView,您需要查看其DataSource并使用它来获取适当的值。

在我的情况下,我需要为用户提供一种快速搜索特定客户端的方法,所以我添加了一个支持AJAX的组合框和OnSelectedIndexChanged,我用它来找到相应的GridView行并选择它:

        Dim i As Integer, DataSetIndex As Integer
        Dim SelectedRowIndex As Integer
        Dim dv As DataView = ObjectDataSourceClients.Select
        Dim dt As DataTable = dv.ToTable

        For i = 0 To dt.Rows.Count - 1
            If dt.Rows(i)("Client_ID") = ComboBoxClientSearch.SelectedValue Then
                DataSetIndex = i
                Exit For
            End If
        Next

        GridViewAllClients.PageIndex = DataSetIndex \ GridViewAllClients.PageSize
        SelectedRowIndex = DataSetIndex - (GridViewAllClients.PageSize * GridViewAllClients.PageIndex)
        GridViewAllClients.SelectedIndex = SelectedRowIndex

        GridViewAllClients.DataBind()

答案 4 :(得分:3)

好的,大多数都是错的。菲尔是唯一有效的人。答案不起作用。 Phil的答案问题在于它与asp.net中的SQL DataTable绑定,没有人使用它们。好吧有些人会这样做,但是当你开始使用被丢弃的设计模式时。

我的示例详细说明了逐行迭代并切换pageindex和重新绑定。我无法搜索实际的DataSource属性,因为它绑定到LinqDataSource控件,我无法获取实际数据。并且搜索DataSource可能无法正常工作,因为你有搜索,排序等来改变数据并抓住它的实际行索引将不是网格(或其他控件)的索引。

我使用隐藏的asp:HiddenControl来保存值,因为jQuery函数实际上执行了回发。 grdLocations是gridview

grdLocations.SelectedIndex = -1;

        bool found = false;
        int index = 0;
        int pageIndex = 0;
        for (int i = 0; i < grdLocations.PageCount; i++)
        {
            for (index = 0; index < grdLocations.DataKeys.Count; index++)
            {
                if (Convert.ToInt32(grdLocations.DataKeys[index].Value.ToString())  == Convert.ToInt32(hidCurrentRigId.Value))
                {
                    found = true;
                    break;
                }
            }

            if (found)
                    break;

            pageIndex++;
            grdLocations.PageIndex = pageIndex;
            grdLocations.DataBind();
        }

        if (found)
        {
            grdLocations.PageIndex = pageIndex;
            grdLocations.SelectedIndex = index;
        }

这将迭代网格视图中的每个页面并选择正确的数据键。

现在要添加,如果您想要基于行查找页面的最简单方法,请在此示例控制台应用程序中使用此数学。这让它变得非常简单

    class Program
{
    static void Main(string[] args)
    {
        int rowIndex = 27;
        int pageCount = 7;
        int currentPage = 3;
        int pageSize = 10;

        Console.WriteLine("Page = " + (rowIndex / pageSize).ToString());
        Console.WriteLine("Row = " + ( rowIndex % pageSize).ToString());
        Console.ReadLine();
    }
}

希望这有助于某人。

答案 5 :(得分:2)

//grab the current datakeyValue
 int orderID = (int)this.GridView1.SelectedDataKey.Value;

//do something 
gridView.databind();

//set back the selected row int the gridView
 for (int i = 0; i <= this.GridView1.DataKeys.Count - 1; i++)
 {
   if ((int)GridView1.DataKeys[i].Value == orderID)
    {
       this.GridView1.SelectedIndex = i;
   }
}

答案 6 :(得分:2)

尝试这种Linq方法:

grdMyGrid.SelectedIndex = grdMyGrid.DataKeys.OfType<DataKey>().ToList<DataKey>().FindIndex(dk => (string)dk.Value == "myKey");

答案 7 :(得分:0)

在GridView_RowDataBound()事件中输入类似的内容:

Dim p As Catalog.Product = CType(e.Row.DataItem, Catalog.Product)
If p IsNot Nothing Then

    If p.Bvin = MySpecificID Then
        e.Row.RowState = DataControlRowState.Selected
    End If

End If

在此示例中,我们将GridView绑定到Catalog.Product类型的自定义对象的集合,并将DataKey命名为Bvin - 您需要根据绑定的内容调整数据类型和键名。

请注意,此事件每行运行一次,因此无需循环。但是,应注意防止数据访问等事件多次发生。

答案 8 :(得分:0)

基本上,如果您已经拥有GridViewRow的实例,那么请执行以下操作:

gridView.SelectedIndex = gridViewRowToBeSelected.RowIndex;