2013-03-27 10 views
6

का उपयोग करके सभी, मैं एक लूप के लिए एक लूप का उपयोग कर एक लूप के लिए लूप करने का प्रयास कर रहा हूं, जो प्रत्येक लूप के लिए गलत कोशिकाओं के पृष्ठभूमि रंग को बदलने के लिए उपयोग कर रहा है। मैंने कई प्रश्नों की जांच की है लेकिन मुझे अभी तक पर्याप्त उत्तर नहीं मिला है। क्या मैं अब तक हैडब्ल्यूपीएफ डाटाग्रिड के माध्यम से लूपिंग फोरैच

public void RunChecks() 
{ 
    const int baseColumnCount = 3; 
    foreach (DataRowView rv in dataGrid.Items) 
    { 
     for (int i = baseColumnCount; i < dataGrid.Columns.Count; i++) 
     { 
      if (!CheckForBalancedParentheses(rv.Row[i].ToString())) 
      { 
       Color color = (Color)ColorConverter.ConvertFromString("#FF0000"); 
       row.Background = new SolidColorBrush(color); // Problem! 
      } 
     } 
    } 
} 

समस्या यह है कि आदेश मेरी DataGrid में एक पंक्ति का Background रंग बदलने के लिए में मैं DataGridRow वस्तु DataRowViewrv साथ ascociated साथ काम करने की जरूरत है।

मैं वस्तु rv (DataRowView) से DataGridRow के लिए एक संदर्भ कैसे मिलता है?

आपके समय के लिए धन्यवाद।

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

<Window.Resources> 
    <Style TargetType="{x:Type DataGridRow}"> 
     <Style.Triggers> 
      <Trigger Property="IsMouseOver" 
        Value="True"> 
       <Setter Property="Background" Value="Red" /> 
       <Setter Property="FontWeight" Value="ExtraBold" /> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</Window.Resources> 

उत्तर

5

है तो आप सीधे, WPF के साथ काम कर रहे हैं जब बचने हमेशा तक पहुँचने यूआई कलाकृतियों।

आप में एक मॉडल बनाएं रंग देखें, और इसे अपने डेटाग्रिड व्यू के एक पंक्ति पंक्ति टेम्पलेट के पृष्ठभूमि रंग से बांधें।

तो रंग बदलने के लिए आप मॉडलव्यू कलेक्टन फेंक देंगे और प्रत्येक एकल पंक्ति से जुड़ी प्रत्येक वस्तु की रंग संपत्ति सेट/पढ़ लेंगे। इसे बदलकर, यदि बाध्यकारी सही ढंग से व्यवस्थित है, तो आप पंक्ति UI रंग उपस्थिति को प्रभावित करेंगे।

ठोस नमूने के लिए आप पर देख सकते हैं:

How do I bind the background of a data grid row to specific color?

+0

आपके समय के लिए धन्यवाद। मैं आपकी सलाह लेगा और पढ़ना शुरू कर दूंगा। मैं बिना किसी किस्मत के रंग और पूरे कॉलम की कोशिश कर रहा हूं। मैंने एक और सवाल पूछा है [यहां] (http://stackoverflow.com/questions/15644105/change-the-background-color-of-entire-column-of-wpf-datagrid-at-runtime) यदि आप बोरेड हो सकते हैं और प्रतिनिधि चाहते हैं। धन्यवाद फिर से ... – MoonKnight

+0

@ किल्करम: विचार पंक्तियों और स्तंभों के लिए समान है। यदि यूआई ऑब्जेक्ट ने कुछ संपत्ति (इस मामले में रंग) साबित किया है जिसे या तो प्रत्यक्ष पहुंच या बाध्यकारी के माध्यम से बदला जा सकता है, तो आप अपने मॉडलव्यू ऑब्जेक्ट से बाइंडिंग का उपयोग करते हैं। – Tigran

+0

धन्यवाद। स्टाइल, ट्रिगर्स इत्यादि पर एक पुस्तक से एक अध्याय पढ़ना। अब मुझे घटना पर माउस पर पंक्ति बदलते रंग मिल गए हैं। हालांकि, मैं इस शैली का उपयोग कर रन-टाइम पर कोड से आवश्यक रंग में सेल/पंक्ति को बदलने के तरीके के रूप में खो गया हूं। यदि आप यहां कोई मदद दे सकते हैं तो इसकी सराहना की जाएगी ... मैंने अपनी शैली को दिखाने के लिए प्रश्न संपादित किया है। – MoonKnight

2

आप ItemContainerGenerator का उपयोग दृश्य प्रतिनिधित्व प्राप्त करने के लिए कर सकते हैं अपने डेटा अर्थात् DataGridRow -

DataGridRow row = (DataGridRow)dataGrid.ItemContainerGenerator 
             .ContainerFromItem(rv); 
+0

यह 'पंक्ति' के लिए 'शून्य' लौटा रहा है। मैंने 'आरवी' की जांच की है और यह शून्य नहीं है। आपको इसके साथ फिर से परेशान करने के लिए खेद है, आपके समय के लिए धन्यवाद ... – MoonKnight

+0

यह आपके जीयूआई पर पंक्ति प्रदान नहीं होने पर ही 'शून्य' वापस कर देगा। आप कितनी पंक्तियों से निपट रहे हैं और आपके ग्रिड पर 'वर्चुअलाइजेशन' सक्षम है? –

+0

यहां लिंक करें - http://stackoverflow.com/questions/6713365/itemcontainergenerator-containerfromitem-returns-null आपकी मदद का हो सकता है। –

0

ज्यादा पढ़ने के बाद मैंने पाया है जो कुछ मैं चाहता था उसे करने का एक तरीका - कुछ स्थितियों के आधार पर रन-टाइम पर रंग कोशिकाएं। इस विधि मैं रंग

public void RunChecks() 
{ 
    const int baseColumnCount = 3; 
    for (int i = baseColumnCount; i < dataGrid.Columns.Count; i++) 
    { 
     foreach (DataGridRow row in Utilities.GetDataGridRows(dataGrid)) 
     { 
      if (row != null) 
      { 
       DataGridCell cell = dataGrid.GetCell(row, i); 

       // Start work with cell. 
       Color color; 
       TextBlock tb = cell.Content as TextBlock; 
       string cellValue = tb.Text; 
       if (!CheckForBalancedParentheses(cellValue)) 
        color = (Color)ColorConverter.ConvertFromString("#FF0000"); 
       else 
        color = (Color)ColorConverter.ConvertFromString("#FFFFFF"); 
       row.Background = new SolidColorBrush(color); 
       //cell.Background = new SolidColorBrush(color); 
      } 
     } 
    } 
} 

करने के लिए इस्तेमाल करते हैं ये जुड़े उपयोगिता तरीकों

public static T GetVisualChild<T>(Visual parent) where T : Visual 
{ 
    T child = default(T); 
    int numVisuals = VisualTreeHelper.GetChildrenCount(parent); 
    for (int i = 0; i < numVisuals; i++) 
    { 
     Visual v = (Visual)VisualTreeHelper.GetChild(parent, i); 
     child = v as T; 
     if (child == null) 
      child = GetVisualChild<T>(v); 
     if (child != null) 
      break; 
    } 
    return child; 
} 

public static DataGridCell GetCell(this DataGrid grid, DataGridRow row, int column) 
{ 
    if (row != null) 
    { 
     DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(row); 
     if (presenter == null) 
     { 
      grid.ScrollIntoView(row, grid.Columns[column]); 
      presenter = GetVisualChild<DataGridCellsPresenter>(row); 
     } 
     DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column); 
     return cell; 
    } 
    return null; 
} 

public static IEnumerable<DataGridRow> GetDataGridRows(DataGrid grid) 
{ 
    var itemsSource = grid.ItemsSource as IEnumerable; 
    if (null == itemsSource) yield return null; 
    foreach (var item in itemsSource) 
    { 
     var row = grid.ItemContainerGenerator.ContainerFromItem(item) as DataGridRow; 
     if (null != row) yield return row; 
    } 
} 

नोट के लिए आवश्यक हैं तथापि, कि कोशिकाओं के रंग सेल के बीच ले जाने के लिए जब उपयोगकर्ता स्क्रॉल! ? यह अभी तक डब्ल्यूपीएफ की एक और अद्भुत परेशानी है। मैं वास्तव में उलझन में हूं कि इस सरल को इतना आसान क्यों बनाया जा सकता है। सुझाव है कि हमें इस तरह की चीज़ के लिए एमवीवीएम-प्रकार पैटर्न का उपयोग करने की ज़रूरत है, मुझे आश्चर्यजनक लगता है ...

मुझे उम्मीद है कि यह किसी और की मदद करेगा।

1

"Killercam" का जवाब मेरे लिए काम किया, लेकिन मैं जोड़ने के लिए की जरूरत:

myDataGrid.UpdateLayout();

तो मुझे यकीन है कि मैं एक अशक्त संदर्भ नहीं मिल रहा है कर रहा हूँ GetCell तरीकों का उपयोग कर से पहले।

कि सभी दर्द के बाद DataGridHelper

में पूरे सहायक वर्ग से देखने के लिए, मैं पूरे कोड कोशिश करते हैं और मैं का सामना करना पड़ा एक और probem जो कि सही ढंग से रंग कोशिकाओं एक स्क्रॉल के दौरान बदल जाता है, समाधान वर्चुअलाइजेशन सक्षम करने के लिए था और मानक के लिए अपना मोड सेट करें।

VirtualizingStackPanel.IsVirtualizing="True" 
VirtualizingStackPanel.VirtualizationMode="Standard" 

इसलिए, उम्मीद है कि इससे किसी भी व्यक्ति को डेटाग्रिड कोशिकाओं के माध्यम से पुन: प्रयास करने की आवश्यकता होगी।

0
//the Class that resembles the Datagrid Item schema 

foreach (Class cl in dgDatagrid.Items) 
    { 
     MessageBox.Show(cl.ID.ToString()); 
    } 

this is the most simplest way to read the datagrid data 
most articles misguide such simple things 
+0

यह प्रश्न का उत्तर प्रदान नहीं करता है। एक बार आपके पास पर्याप्त [प्रतिष्ठा] (https://stackoverflow.com/help/whats-reputation) हो जाने पर आप [किसी भी पोस्ट पर टिप्पणी कर सकेंगे] (https://stackoverflow.com/help/privileges/comment); इसके बजाय, [उन उत्तरों को प्रदान करें जिन्हें पूछताछ से स्पष्टीकरण की आवश्यकता नहीं है] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- i-कर-बजाय)। - [समीक्षा से] (/ समीक्षा/कम गुणवत्ता वाली पोस्ट/17321773) –

संबंधित मुद्दे