我想要类似下面的伪代码:
myGridView.SelectedIndex = myGridView.DataKeys.IndexOf("mySpecificKey");
我已经做了一些Intellisense探索,但我还没有找到一个明显的方法来做到这一点。如果找不到DataKey,我想将SelectedIndex设置为-1。
答案 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;