2010-05-12 14 views
48

में डेटाके मूल्य प्राप्त करें मेरे पास संबंधित DataKey है, जो आइटम आईडी है। मैं उस मान को RowCommand ईवेंट के अंदर कैसे प्राप्त करूं?GridView RowCommand

ऐसा लगता है, लेकिन मुझे LinkButton पर कास्ट पसंद नहीं है (क्या होगा यदि कोई अन्य आदेश घटना को फायर कर रहा है?), और मुझे NamingContainer बिट के बारे में बहुत भरोसा नहीं है।

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

मुझे पता है कि मैं बजाय CommandArgument के रूप में है कि आईडी गुजारें सकता हूँ, लेकिन मैं DataKey उपयोग करने के लिए मुझे और अधिक लचीलापन देने के लिए चुना है।

मुझे यह भी पता है कि आईडी के लिए एक छिपे हुए क्षेत्र का उपयोग करना संभव है, लेकिन मुझे लगता है कि एक हैक जिसे मैं उपयोग नहीं करना चाहता हूं।

उत्तर

84

मैं आमतौर पर कमांडरगुमेंट के माध्यम से रोइंडेक्स पास करता हूं और डेटाके मूल्य को पुनर्प्राप्त करने के लिए इसका उपयोग करता हूं।

बटन पर:

GridView मैं जोड़ा में:

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

सर्वर ईवेंट

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

मैं कमांड आर्ग्यूमेंट का उपयोग कर समाप्त हुआ, लेकिन मैं देख सकता हूं कि यह समाधान कैसे काम करेगा। – Farinha

+1

मुझे लगता है कि जब आपको केवल एक से अधिक मान प्राप्त करने की आवश्यकता होती है तो मुझे सबसे अच्छा लगता है ... – Elph

+0

जब मैंने बटन के बजाए एक लिंक का उपयोग किया, तो मुझे एएसपीएक्स पेज में कमांड एर्ग्यूमेंट सेट किए बिना काम करने के लिए मिला। घटना तर्क की कमांडरगुमेंट संपत्ति में पंक्ति की अनुक्रमणिका शामिल थी। मैंने सर्वर सर्वर के लिए कोड का इस्तेमाल किया और यह काम किया। – grahamesd

26

मैं इस कोड का उपयोग DataKeys का मूल्य पाने में कामयाब रहे

DataKeyNames="ID" OnRowCommand="myRowCommand" 

तब मेरे पंक्ति आदेश समारोह में:

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

एकाधिक डेटाकेस का उपयोग करते समय मैं सुझाव देता हूं: स्ट्रिंग आईडी = myGrid.DataKeys [myRow.RowIndex]। वैल्यूज़ ("आईडी")। ToString() – Shide

5

तुम सिर्फ कर सकते हैं:

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

नहीं, यह पर्याप्त नहीं है। 'CommandArgument' का प्रारंभिक मान पंक्ति आईडी नहीं है, यह एक खाली स्ट्रिंग है। – modiX

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

आप जबकि foreach साथ या OnRowDataBound की तरह किसी भी GridView घटना के लिए एक यात्रा कर इस कोड का उपयोग कर सकते हैं।

यहां आप कॉमा , से अलग करके DataKeyNames के लिए एकाधिक मान इनपुट कर सकते हैं। उदाहरण के लिए, DataKeyNames="ProductID,ItemID,OrderID"

अब आप नीचे की तरह अपने सूचकांक प्रदान करके DataKeys पहुंचें:

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(); 
:

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(); 

आप नीचे की तरह DataKeyNames संग्रह से मूल्यों को प्राप्त करने के लिए अपने सूचकांक के बजाय कुंजी का नाम उपयोग कर सकते हैं

2

बटन पर:

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

सर्वर पर भी टी

e.CommandArgument