2012-04-16 17 views
38

पर आधारित डेटा ग्रिड व्यू में एक पंक्ति पाएं मेरे पास डेटा ग्रिड व्यू है जिसमें 3 कॉलम हैं: SystemId, FirstName, LastName जो डेटाबेस जानकारी का उपयोग करके बाध्य है। लेकिन नहीं एक उदाहरण मेंकॉलम और मान

dataGridView1.Rows[????].Selected = true; 

पंक्ति आईडी मैं हालांकि पता नहीं है और bindingsource बदलता रहता है, इस प्रकार 10 पंक्ति हो सकता है "जॉन स्मिथ": मैं एक निश्चित पंक्ति है, जो मैं का उपयोग करते हैं उजागर करने के लिए चाहते हैं यहां तक ​​कि एक दूसरे में भी मौजूद है (मेरे पास एक फ़िल्टर है जो उपयोगकर्ता द्वारा दर्ज किए गए स्रोत के आधार पर स्रोत को फ़िल्टर करता है, इसलिए "जोह" में टाइपिंग उन सभी पंक्तियों को उत्पन्न करेगी जहां पहले/अंतिम नाम में "जॉन" है, इस प्रकार मेरी सूची 50 नामों से जा सकती है एक क्लिक में 3 करने के लिए)।

मैं एक तरीका खोजना चाहता हूं कि मैं SystemId और इसी संख्या के आधार पर एक पंक्ति का चयन कैसे कर सकता हूं। मैं निम्न विधि का उपयोग कर सिस्टम आईडी प्राप्त कर सकता हूं:

systemId = dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells["SystemId"].Value.ToString(); 

अब मुझे इसे पंक्ति चयनकर्ता पर लागू करने की आवश्यकता है। DataGridView1.Columns ["SystemId"] की तरह कुछ। IndexOf (systemId} लेकिन यह काम नहीं करता है (न ही इस तरह की विधि मौजूद है)। किसी भी मदद की बहुत सराहना की जाती है।

+0

उन कौन ** WPF का उपयोग ** इसे [लिंक] देखें (https://stackoverflow.com/a/1976506/6597375) –

उत्तर

109

यह आपको मूल्य के लिए ग्रिडव्यू पंक्ति अनुक्रमणिका देगा:

String searchValue = "somestring"; 
int rowIndex = -1; 
foreach(DataGridViewRow row in DataGridView1.Rows) 
{ 
    if(row.Cells[1].Value.ToString().Equals(searchValue)) 
    { 
     rowIndex = row.Index; 
     break; 
    } 
} 

या एक LINQ क्वेरी

int rowIndex = -1; 

     DataGridViewRow row = dgv.Rows 
      .Cast<DataGridViewRow>() 
      .Where(r => r.Cells["SystemId"].Value.ToString().Equals(searchValue)) 
      .First(); 

     rowIndex = row.Index; 

तो आप कर सकते हैं:

dataGridView1.Rows[rowIndex].Selected = true; 
+2

बहुत धन्यवाद! जांचें और एक अपवोट =) – Lukas

+1

यह वास्तव में मेरे अधिकांश समय को बचाया गया है, मेरी राय में सबसे अच्छा तरीका linq विधि है ..: डी –

+0

मैं डेटाबाउंडटैम की एक साफ कलाकार के लिए अपने व्यूमोडेल में जाउंगा और इसकी संपत्ति पर तुलना करूंगा सीधे ... तो आप कॉलम नामों पर निर्भर नहीं हैं। फिर भी, मैं जिस समाधान के लिए गया, धन्यवाद! – Kjellski

1

यदि आप सिर्फ यह जांचना चाहते हैं कि वह आइटम मौजूद है या नहीं:

IEnumerable<DataGridViewRow> rows = grdPdfs.Rows 
      .Cast<DataGridViewRow>() 
      .Where(r => r.Cells["SystemId"].Value.ToString().Equals(searchValue)); 
if (rows.Count() == 0) 
{ 
    // Not Found 
} 
else 
{ 
    // Found 
} 
+0

यदि आप सिर्फ पंक्तियों के अस्तित्व की जांच करना चाहते हैं, तो उपयोग करें .एनी() –

2

या आप इस तरह उपयोग कर सकते हैं। यह तेज़ हो सकता है।

int iFindNo = 14; 
int j = dataGridView1.Rows.Count-1; 
int iRowIndex = -1; 
for (int i = 0; i < Convert.ToInt32(dataGridView1.Rows.Count/2) +1; i++) 
{ 
    if (Convert.ToInt32(dataGridView1.Rows[i].Cells[0].Value) == iFindNo) 
    { 
     iRowIndex = i; 
     break; 
    } 
    if (Convert.ToInt32(dataGridView1.Rows[j].Cells[0].Value) == iFindNo) 
    { 
     iRowIndex = j; 
     break; 
    } 
    j--; 
} 
if (iRowIndex != -1) 
    MessageBox.Show("Index is " + iRowIndex.ToString()); 
else 
    MessageBox.Show("Index not found."); 
2

इस प्रयास करें: AllowUserToAddRowsfalse पर सेट है

 string searchValue = textBox3.Text; 
     int rowIndex = -1; 

     dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect; 
     try 
     { 
      foreach (DataGridViewRow row in dataGridView1.Rows) 
      { 
       if (row.Cells["peseneli"].Value.ToString().Equals(searchValue)) 
       { 
        rowIndex = row.Index; 
        dataGridView1.CurrentCell = dataGridView1.Rows[rowIndex].Cells[0]; 
        dataGridView1.Rows[dataGridView1.CurrentCell.RowIndex].Selected = true; 

        break; 
       } 
      } 
     } 
     catch (Exception exc) 
     { 
      MessageBox.Show(exc.Message); 
     } 
16

ऊपर जवाब ही काम करते हैं। यदि वह प्रॉपर्टी true पर सेट है, तो आपको NullReferenceException मिलेगा जब लूप या लिंक क्वेरी नई पंक्ति पर बातचीत करने का प्रयास करती है। मैंने AllowUserToAddRows = true को संभालने के लिए ऊपर दिए गए दो स्वीकृत उत्तरों को संशोधित किया है।

लूप जवाब:

String searchValue = "somestring"; 
int rowIndex = -1; 
foreach(DataGridViewRow row in DataGridView1.Rows) 
{ 
    if (row.Cells["SystemId"].Value != null) // Need to check for null if new row is exposed 
    { 
     if(row.Cells["SystemId"].Value.ToString().Equals(searchValue)) 
     { 
      rowIndex = row.Index; 
      break; 
     } 
    } 
} 

LINQ जवाब:

int rowIndex = -1; 

bool tempAllowUserToAddRows = dgv.AllowUserToAddRows; 

dgv.AllowUserToAddRows = false; // Turn off or .Value below will throw null exception 

    DataGridViewRow row = dgv.Rows 
     .Cast<DataGridViewRow>() 
     .Where(r => r.Cells["SystemId"].Value.ToString().Equals(searchValue)) 
     .First(); 

    rowIndex = row.Index; 

dgv.AllowUserToAddRows = tempAllowUserToAddRows; 
+2

मैं कुछ देर से बहुत देर हो चुकी हूं, लेकिन मुझे लगता है कि इससे पहले कभी देर हो चुकी है। :) आपको खोज के कारण +1 दे रहा है। – Lukas

1

इस गॉर्डन से ऊपर जवाब पर बनाता है - नहीं इसके बारे में सब मेरा मूल कार्य है। मैंने जो किया वह मेरी स्थिर उपयोगिता कक्षा में एक और सामान्य विधि जोड़ रहा था।

public static int MatchingRowIndex(DataGridView dgv, string columnName, string searchValue) 
     { 
     int rowIndex = -1; 
     bool tempAllowUserToAddRows = dgv.AllowUserToAddRows; 

     dgv.AllowUserToAddRows = false; // Turn off or .Value below will throw null exception 
     if (dgv.Rows.Count > 0 && dgv.Columns.Count > 0 && dgv.Columns[columnName] != null) 
      { 
      DataGridViewRow row = dgv.Rows 
       .Cast<DataGridViewRow>() 
       .FirstOrDefault(r => r.Cells[columnName].Value.ToString().Equals(searchValue)); 

      rowIndex = row.Index; 
      } 
     dgv.AllowUserToAddRows = tempAllowUserToAddRows; 
     return rowIndex; 
     } 

जो कुछ भी रूप मैं इसे उपयोग करना चाहते हैं तो, मैं विधि DataGridView, स्तंभ नाम और खोज मूल्य गुजर कहते हैं। सादगी के लिए मैं खोज के लिए स्ट्रिंग में सबकुछ बदल रहा हूं, हालांकि डेटा प्रकारों को निर्दिष्ट करने के लिए अधिभार जोड़ने में काफी आसान होगा।

private void UndeleteSectionInGrid(string sectionLetter) 
     { 
     int sectionRowIndex = UtilityMethods.MatchingRowIndex(dgvSections, "SectionLetter", sectionLetter); 
     dgvSections.Rows[sectionRowIndex].Cells["DeleteSection"].Value = false; 
     } 
0

जो लोग WPF

for (int i = 0; i < dataGridName.Items.Count; i++) 
{ 
     string cellValue= ((DataRowView)dataGridName.Items[i]).Row["columnName"].ToString();     
     if (cellValue.Equals("Search_string")) // check the search_string is present in the row of ColumnName 
     { 
     object item = dataGridName.Items[i]; 
     dataGridName.SelectedItem = item; // selecting the row of dataGridName 
     dataGridName.ScrollIntoView(item);      
     break; 
     } 
} 

का उपयोग आप इस के बाद चयनित पंक्ति आइटम प्राप्त करना चाहते हैं, follwing कोड स्निपेट उपयोगी है

DataRowView drv = dataGridName.SelectedItem as DataRowView; 
DataRow dr = drv.Row; 
string item1= Convert.ToString(dr.ItemArray[0]);// get the first column value from selected row 
string item2= Convert.ToString(dr.ItemArray[1]);// get the second column value from selected row 
संबंधित मुद्दे