2012-03-14 14 views
6

मेरे पास डेटाग्रिड व्यू है जो POCO ऑब्जेक्ट्स की एक सूची से जुड़ा हुआ है। पीओसीओ गुणों में से एक एक बूल है, जिसे चेकबॉक्स द्वारा दर्शाया जाता है। मैं जो चाहूं वह कई पंक्तियों का चयन करने में सक्षम होना है, फिर जब मैं चेकबॉक्स में से किसी एक पर क्लिक करता हूं, तो सभी हाइलाइट की गई पंक्तियों में उनके चेक बॉक्स चेक किए जाते हैं। उदाहरण के तौर पर, यदि आप वीएस 2010 के तहत टीएफएस का उपयोग कर रहे हैं, तो मैं लंबित परिवर्तन स्क्रीन पर व्यवहार को दोहराने की कोशिश कर रहा हूं।डेटाग्रिड व्यू: सभी चयनित पंक्तियों में एक संपादन लागू करें

मेरी समस्या यह है कि मुझे सुनने के लिए उपयुक्त घटना नहीं मिल रही है। अधिकतर डेटाग्रिड व्यू क्लिक घटनाएं कॉलम/पंक्ति स्तर पर संचालित होती प्रतीत होती हैं, और मुझे कुछ ऐसा लगता है जो चेकबॉक्स पर क्लिक करते समय आग लगती है। CellContentClick निकटतम आता है, लेकिन के बाद आग को अचयनित किया गया है, इसलिए यह काम नहीं करेगा।

क्या किसी के पास कोई सुझाव है?

+0

क्या आपका मतलब सभी चेक बॉक्स का चयन करना है? – PraveenVenu

+0

काफी नहीं। मान लीजिए कि आपके पास छह पंक्तियां हैं, और आप 4 पंक्तियों को हाइलाइट/चुनते हैं। फिर आप उन हाइलाइट की गई पंक्तियों में से एक में चेकबॉक्स पर क्लिक करते हैं, इसकी स्थिति को चेक करने के लिए बदलते हैं। सभी पिछली चयनित पंक्तियों को अब उनकी पिछली स्थिति के बावजूद जांचना चाहिए। – TarkaDaal

+0

नीति को सरल रखना आसान है। उपयोगकर्ता ग्रिड में पंक्ति का चयन करते समय डेटा डेटा पंक्ति के लिए संपत्ति मूल्य को क्यों नहीं बदलते हैं। जो जीयूआई को इसके बाध्य नियंत्रण के रूप में अपडेट करेगा। –

उत्तर

10

जब आप चेकबॉक्स मान बदल गए हैं तो आप CurrentCellDirtyStateChanged का उपयोग कर सकते हैं। लेकिन जब यह घटना ट्रिगर होती है, तो चयनित हो जाएंगे। आपको बस इससे पहले चयनित करना है।

एक साधारण नमूना: आप इसे आसानी से पूरा कर सकते हैं।

DataGridViewSelectedRowCollection selected; 

private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e) 
{ 
    DataGridView dgv = (DataGridView)sender; 
    DataGridViewCell cell = dgv.CurrentCell; 
    if (cell.RowIndex >= 0 && cell.ColumnIndex == 1) // My checkbox column 
    { 
     // If checkbox value changed, copy it's value to all selectedrows 
     bool checkvalue = false; 
     if (dgv.Rows[cell.RowIndex].Cells[cell.ColumnIndex].EditedFormattedValue != null && dgv.Rows[cell.RowIndex].Cells[cell.ColumnIndex].EditedFormattedValue.Equals(true)) 
      checkvalue = true; 

     for (int i=0; i<selected.Count; i++) 
      dgv.Rows[selected[i].Index].Cells[cell.ColumnIndex].Value = checkvalue; 
    } 

    dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit); 
} 

private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) 
{ 
    selected = dataGridView1.SelectedRows; 
} 
1

यह एक अच्छा डिजाइन नहीं है, लेकिन आप MouseDown घटना उपयोग करने के लिए (जो ग्रिड से पहले ट्रिगर किया जाएगा चयन बदल) कोशिश कर सकते हैं और hitTest (पता करने के लिए जहां उपयोगकर्ता क्लिक कर रहा है):

private void dataGridView1_MouseDown(object sender, MouseEventArgs e) 
{ 
    var hitTest = this.dataGridView1.HitTest(e.X, e.Y); 
    if (hitTest.Type == DataGridViewHitTestType.Cell && hitTest.ColumnIndex == 0 /* set correct column index */) 
    { 
     foreach (DataGridViewRow row in this.dataGridView1.Rows) 
     { 
      // Toggle 
      row.Cells[0].Value = !((bool)row.Cells[0].Value); 
     } 
    } 
} 
संबंधित मुद्दे