2010-05-12 18 views
48

GridView ile ilgili bir DataKey ürün kimliğidir. RowCommand etkinliğinde bu değeri nasıl alabilirim?GridView satırında DataKey değerleri alın RowCommand

Bu işe yarıyor gibi görünüyor, ancak ben LinkButton için almayı sevmiyorum (başka bir komutun olayı tetikliyorsa?) Ve ben NamingContainer bit hakkında çok emin değilim.

LinkButton lb = (LinkButton)e.CommandSource; 
GridViewRow gvr = (GridViewRow)lb.NamingContainer; 
int id = (int)grid.DataKeys[gvr.RowIndex].Value; 

ben yerine CommandArgument olarak bu kimliği geçebileceği farkında değilim, ama bana daha fazla esneklik sağlamak için DataKey kullanmayı tercih etti.

Ayrıca kimliğin gizli bir alan kullanmasının mümkün olduğunu biliyorum, ancak kullanmak istemediğim bir kesmek olduğunu düşünüyorum.

cevap

84

Genellikle RowIndex'i CommandArgument yoluyla geçiriyorum ve kullanmak istediğim DataKey değerini almak için kullanıyorum. Düğmesi

: Eklediğim GridView'da yılında

:

int rowIndex = int.Parse(e.CommandArgument.ToString()); 
string val = (string)this.grid.DataKeys[rowIndex]["myKey"]; 
+0

CommandArgument kullanarak sona erdim, ancak bu çözümün nasıl çalışacağını da görebiliyorum. – Farinha

+1

Sadece bir değerden daha fazlasına ihtiyacınız olduğunda en iyisi ... – Elph

+0

Düğme yerine bir bağlantı kullandığımda, bunu aspx sayfasında CommandArgument'i ayarlamadan çalışması için aldım. Etkinlik arg'in CommandArguement özelliği, satırın dizinini içeriyordu. Sadece sunucu olayı için kod kullandım ve işe yaradı. – grahamesd

26

Sunucu Etkinlikte

CommandArgument='<%# DataBinder.Eval(Container, "RowIndex") %>' 

Bu kodu kullanarak DataKeys değerini başardı

DataKeyNames="ID" OnRowCommand="myRowCommand" 

Sonra satır komut işlevinde:

protected void myRowCommand(object sender, GridViewCommandEventArgs e) 
{ 
    LinkButton lnkBtn = (LinkButton)e.CommandSource; // the button 
    GridViewRow myRow = (GridViewRow)lnkBtn.Parent.Parent; // the row 
    GridView myGrid = (GridView)sender; // the gridview 
    string ID = myGrid.DataKeys[myRow.RowIndex].Value.ToString(); // value of the datakey 

    switch (e.CommandName) 
    { 
     case "cmd1": 
     // do something using the ID 
     break; 
     case "cmd2": 
     // do something else using the ID 
     break; 
    } 
} 
+2

kullanmanızı öneririm birden çok datakeys kullanırken: string ID = myGrid.DataKeys [myRow.RowIndex] .Values ​​("ID") ToString() – Shide

5

sadece bunu yapabilirsiniz: foreach ile veya OnRowDataBound gibi herhangi GridView olay için yineleme yaparken

string id = GridName.DataKeys[Convert.ToInt32(e.CommandArgument)].Value.ToString(); 
+2

Hayır, bu yeterli değil. 'CommandArgument' öğesinin başlangıç ​​değeri satır kimliği değil, boş bir dizedir. – modiX

8
foreach (GridViewRow gvr in gvMyGridView.Rows) 
{ 
    string PrimaryKey = gvMyGridView.DataKeys[gvr.RowIndex].Values[0].ToString(); 
} 

Bu kodu kullanabilirsiniz.

Burada, , virgülle ayırarak DataKeyNames için birden çok değer girebilirsiniz. Örneğin, DataKeyNames="ProductID,ItemID,OrderID".

Şimdi aşağıdaki gibi endeksini sağlayarak DataKeys her erişebilirsiniz:

string ProductID = gvMyGridView.DataKeys[gvr.RowIndex].Values["ProductID"].ToString(); 
string ItemID = gvMyGridView.DataKeys[gvr.RowIndex].Values["ItemID"].ToString(); 
string OrderID = gvMyGridView.DataKeys[gvr.RowIndex].Values["OrderID"].ToString(); 
: Ayrıca yerine aşağıda gibi DataKeyNames koleksiyonundan değerlerini almak için, indeksinin Anahtar Adını kullanabilirsiniz

string ProductID = gvMyGridView.DataKeys[gvr.RowIndex].Values[0].ToString(); 
string ItemID = gvMyGridView.DataKeys[gvr.RowIndex].Values[1].ToString(); 
string OrderID = gvMyGridView.DataKeys[gvr.RowIndex].Values[2].ToString(); 

Düğmesi

2

:

CommandArgument='<%# Eval("myKey")%>' 

Server bile t

e.CommandArgument