2009-07-16 15 views
5

बदलने GridView स्तंभ गुणों को मैं बहुत की तरह एक विधि में एक GridView बनाने हूँ:से कोड-पीछे

GridView gridView = new GridView(); 
gridView.DataSource = reportData.Tables[0]; 
gridView.DataBind(); 

मैं बाद में एक्सेल में निर्यात कर रहा हूँ और यह बहुत अच्छा काम करता है। कॉलम को मेरे स्रोत डेटा से स्वतः उत्पन्न किया जा रहा है। मैं कुछ कॉलम की DataFormatString प्रॉपर्टी को बदलना चाहता हूं, हालांकि मैं डाटाबेस के बाद और एक्सेल में निर्यात करने से पहले। मुझे बदलने के लिए सही संपत्ति नहीं मिल रही है। क्या कोई मुझे सही दिशा में निर्देशित कर सकता है?

उत्तर

7

अनुसार AutoGenerateColumns documentation करने के लिए:: यह कुछ मदद की हो सकती है

यह विकल्प एक सुविधाजनक तरीका डेटा स्रोत में हर क्षेत्र प्रदर्शित करने के लिए प्रदान करता है; हालांकि, आपके पास सीमित नियंत्रण है कि स्वचालित रूप से जेनरेट किए गए कॉलम फ़ील्ड को प्रदर्शित किया जाता है या व्यवहार करता है।

नोट: स्वचालित रूप से उत्पन्न बाध्य स्तंभ फ़ील्ड नहीं कॉलम संग्रह से जुड़ जाते हैं।

मैं बिना किसी किस्मत के इन AutoGeneratedField एस की तलाश में थक गया।
मैं कई विकल्प के बारे में सोच सकते हैं कि प्राप्त करने के लिए (सबसे खराब से सबसे अच्छा करने के लिए):

  1. ग्रिड में एक ईवेंट जोड़ें (RowDataBound की तरह), यह आप पंक्तियों 'कोशिकाओं तक पहुंच हासिल होगी, लेकिन नहीं है बहुत सुविधाजनक
  2. AutoGeneratedField ये कॉलम मैन्युअल बनाएँ, के रूप में उपयोग न करें:

    BoundField dateField = new BoundField(); 
    dateField.HeaderText = "Date"; 
    dateField.DataField = "date"; 
    dateField.DataFormatString = "{0:MMMM, yyyy}"; 
    gridView.Columns.Add(dateField); 
    

    यह विकल्प आपको bes खिताब पर नियंत्रण देता है।

  3. डेटा स्वरूपण और प्रस्तुति के लिए एक और परत जोड़ें। यह शायद सबसे अच्छा विकल्प है। साथ ही, इस तरह आपको डेटाटेबल्स का उपयोग करने की आवश्यकता नहीं है, एक ग्रिड व्यू सार्वजनिक गुणों के साथ ऑब्जेक्ट्स के किसी संग्रह को बाध्य कर सकता है (उदाहरण के लिए, List<Employee) पर), और AutoGeneratedField उन्हें कॉलम में बदल देता है।
    मुझे लगता है कि यह सबसे अच्छा विकल्प है। मान लीजिए कि आप ऑटो कॉलम तक पहुंच सकते हैं, फिर क्या? आपको इसके नाम या अनुक्रमणिका के आधार पर एक कॉलम खोजना होगा, जो बहुत गन्दा लगता है, और युग्मन बढ़ता है।

और, अंतिम नोट के रूप में, आपको एपीआई का उपयोग करके Excel फ़ाइलों को बनाने के बारे में सोचना चाहिए। यह इतना आसान नहीं है, लेकिन एचटीएमएल एक्सएलएस फाइलें एक्सेल 2007 के साथ कम संगत हैं - यह एक चेतावनी संदेश प्रदर्शित करती है कि फ़ाइल का प्रारूप एक्सटेंशन के साथ असंगत है, और बदतर, फ़ाइल ब्रेक खोलने और सहेजने पर (Save As हो सकता है)), अपनी फाइलें कम उपयोगकर्ता के अनुकूल बनाते हैं।

+0

एपीआई का उपयोग करने के लिए एक्सेल को सर्वर पर स्थापित करने की आवश्यकता है ... सही? –

+0

मुझे विश्वास है कि यदि आप कार्यालय इंटरऑप का उपयोग कर रहे हैं। यदि आप xlsx फ़ाइलों (कार्यालय 2007 के) बनाते हैं, तो वे मूल रूप से ज़िपित XML फ़ाइलों का समूह होते हैं, ताकि आप उन्हें अपेक्षाकृत आसानी से बना सकें (सर्वोत्तम - लाइब्रेरी ढूंढें)। आप एक्सेल को कनेक्शन स्ट्रिंग और ओले डीबी के माध्यम से भी लिख सकते हैं। सबसे आसान तरीका, बीटीडब्ल्यू (फॉर्मेटिंग के बिना आप), एक सीएसवी फ़ाइल बनाने के लिए है। – Kobi

+0

मैं सर्वर पर एक्सेल स्थापित नहीं कर सकता। मैं xlsx फ़ाइलों का उपयोग नहीं कर सकता क्योंकि इन्हें 2000 और 2003 के साथ संगत होना है। स्वरूपण आवश्यक है इसलिए मैं csv का उपयोग नहीं कर सकता। मुझे लगता है कि मैं ऊपर अपना दूसरा सुझाव आज़मा सकता हूं और मैं देखता हूं कि यह कैसे काम करता है। धन्यवाद! –

-1

यह मुद्दा है कि asp.net कैसे काम करता है। जब आप किसी विधि में कुछ नियंत्रण (कॉलम) बनाते हैं और यह नियंत्रण उपयोगकर्ता को सेट करते हैं, अगली बार जब उपयोगकर्ता पोस्ट आपको डेटा का बैक करता है, तो आपके पास उन स्तंभों तक पहुंच नहीं है क्योंकि वे मौजूद नहीं हैं। हर बार जब आप अपनी साइट प्रदर्शित करते हैं, तो एक ब्रांड नई वस्तु (उदाहरण) बनाई जाती है।

String newDataFormatString = "{0:d}"; 
BoundField bf = gridView.Columns[Index] as BoundField; 
if (bf != null) { 
    bf.DataFormatString = "{0}"; // workaround to sync with ViewState (it's documented) 
    bf.DataFormatString = newDataFormatString; 
} 
+0

मुझे यकीन नहीं है कि आप समझते हैं कि मैं यहां क्या करने की कोशिश कर रहा हूं। मैं Excel में तत्काल निर्यात करने के लिए कोड में ग्रिड का एक उदाहरण बना रहा हूं। पोस्टबैक कोई मुद्दा नहीं है। –

0

उदाहरण के लिए है एक ग्रिड व्यू में नियंत्रण को उन अक्षरों में परिवर्तित करता है जिन्हें फिर से तैयार किया जाता है।

 /// <summary> 
    /// Parses and cleans up data from the GridView controls collection 
    /// to make the data more suitable for Exported 
    /// </summary> 
    /// <param name="gv">The GridView to parse</param> 
    private void CleanUpControls(Control gv) 
    { 
     Literal l = new Literal(); 

     for (int i = 0; i < gv.Controls.Count; i++) 
     { 

      if (gv.Controls[i].GetType() == typeof (LinkButton)) 
      { 
       l.Text = (gv.Controls[i] as LinkButton).Text; 
       ReplaceWithLiteral(gv, l, i); 
      } 
      else if (gv.Controls[i].GetType() == typeof (ListControl)) 
      { 
       l.Text = (gv.Controls[i] as ListControl).SelectedItem.Text; 
       ReplaceWithLiteral(gv, l, i); 
      } 
      else if (gv.Controls[i].GetType() == typeof (CheckBox)) 
      { 
       l.Text = (gv.Controls[i] as CheckBox).Checked ? "True" : "False"; 
       ReplaceWithLiteral(gv, l, i); 
      } 
      else if (gv.Controls[i].GetType() == typeof (BooleanImage)) 
      { 
       l.Text = (gv.Controls[i] as BooleanImage).Value ? "True" : "False"; 
       ReplaceWithLiteral(gv, l, i); 
      } 
      else if (gv.Controls[i].GetType().ToString() == "System.Web.UI.WebControls.PagerTable") 
       ReplaceWithLiteral(gv, l, i); 

      else if (gv.Controls[i].GetType() == typeof (HyperLink)) 
      { 
       HyperLink hl = gv.Controls[i] as HyperLink; 
       if (MakeHyperLinksAbsolute) 
       { 
        if (hl != null) 
         hl.NavigateUrl = UrlHelper.MakeAbsoluteUrl(hl.NavigateUrl); 
       } 

       switch (TreatHyperLinksAs) 
       { 
        case HyperLinkMode.Text: 
         l.Text = hl.Text; 
         ReplaceWithLiteral(gv, l, i); 
         break; 

        case HyperLinkMode.NavigateUrl: 
         if (hl != null) l.Text = hl.NavigateUrl; 
         ReplaceWithLiteral(gv, l, i); 
         break; 

        case HyperLinkMode.ToolTip: 
         l.Text = hl.ToolTip; 
         ReplaceWithLiteral(gv, l, i); 
         break; 

        case HyperLinkMode.TextAndLink: 
         l.Text = String.Format("{0} ({1})", hl.Text, hl.NavigateUrl); 
         ReplaceWithLiteral(gv, l, i); 
         break; 

        case HyperLinkMode.HyperLink: 
         break; 
       } 
      } 

      if (gv.Controls[i].HasControls()) 
       CleanUpControls(gv.Controls[i]); 
     } 
    } 
+0

ऐसा लगता है कि ऑटोजनेर कॉलम का उपयोग करते समय कॉलम संग्रह खाली होता है, हालांकि अंतिम परिणाम में वास्तव में कॉलम होते हैं। –

-1

यहाँ एक GridView निर्यातक मुझे लगता है कि लिखा से एक उद्धरण है:
एक ही रास्ता पूर्व में बनाए गए नियंत्रण से वापस पोस्ट में डेटा प्राप्त करने में सक्षम हो Page_Init विधि में नियंत्रण बनाने के लिए ...

+0

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

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