我想類似下面的僞代碼的東西:如何在基於DataKey的ASP.NET GridView中設置選定的行?
myGridView.SelectedIndex = myGridView.DataKeys.IndexOf("mySpecificKey");
我已經做了一些探索智能感知,但我還沒有找到一個明顯的方式做到這一點。如果DataKey未找到,我想將SelectedIndex設置爲-1。
我想類似下面的僞代碼的東西:如何在基於DataKey的ASP.NET GridView中設置選定的行?
myGridView.SelectedIndex = myGridView.DataKeys.IndexOf("mySpecificKey");
我已經做了一些探索智能感知,但我還沒有找到一個明顯的方式做到這一點。如果DataKey未找到,我想將SelectedIndex設置爲-1。
我已經結束了與
For n As Integer = 0 To myGridView.DataKeys.Count - 1
If myGridView.DataKeys(n).Value = myKeyObj Then
myGridView.SelectedIndex = n
End If
Next
//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;
}
}
你有沒有考慮一個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);
}
}
你只以上方法搜索的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()
把這樣的事情在你的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 - 您將需要調整數據類型和密鑰名稱取決於你綁定到什麼。
注意這個事件已經每行運行一次,所以沒有必要循環。但是,應該注意防止諸如數據訪問之類的事情多次發生。
試試這個方法的Linq:
grdMyGrid.SelectedIndex = grdMyGrid.DataKeys.OfType<DataKey>().ToList<DataKey>().FindIndex(dk => (string)dk.Value == "myKey");
好,其中大部分是錯誤的。菲爾是唯一能夠工作的人。答案不起作用。 Phil的答案是,它與asp.net中的SQL DataTable綁定,沒有人使用它。那麼有些人會這樣做,但是當你開始使用掉落的設計模式時。
我的示例細節逐行迭代並切換pageindex和rebinding。我無法搜索實際的DataSource屬性,因爲它綁定到LinqDataSource控件,我無法獲取實際的數據。而搜索DataSource可能無法工作,因爲你有搜索,排序等來改變數據並抓取它的實際行索引不會是網格(或其他控件)的索引。
我用一個隱藏的asp:HiddenControl來保存值,因爲,一個jQuery函數實際上執行回發。 grdLocation是網格視圖
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();
}
}
希望這可以幫助別人。
這個工作,它是很好的和短:
int MyId = 22;
foreach (GridViewRow gvRow in gridview1.Rows)
{
if ((int)gridview1.DataKeys[gvRow.DataItemIndex].Value == MyId)
{
gridview1.SelectedIndex = gvRow.DataItemIndex;
break;
}
}
基本上,如果你已經有了GridViewRow實例,那麼這樣做:
gridView.SelectedIndex = gridViewRowToBeSelected.RowIndex;
可以使用觸摸的空白,但這很不錯。 – Kirk 2011-09-15 21:03:09
我同意。感謝您的評論。 :-) – 2011-09-29 12:49:18