2010-08-09 16 views

उत्तर

14

अपने डेटा स्रोत को उस ऑब्जेक्ट के प्रकार पर सेट करें जिसे आप ग्रिड व्यू में बाध्य कर रहे हैं, रिक्त मानों से भरे एक ऑब्जेक्ट के साथ, फिर उस डेटारो को छुपाएं।

संपादित करें: आप एक datatable का उपयोग कर रहे के बाद से ...

DataTable dt = new DataTable(); 

// Define all of the columns you are binding in your GridView 
dt.Columns.Add("AColumnName"); 
... 
... 

DataRow dr = dt.NewRow(); 
dt.Rows.Add(dr); 

myGridView.DataSource = dt; 
myGridView.DataBind(); 
+0

मैं एक datatable का उपयोग कर रहा है, तो आप किसी भी नमूने लिए क्या है? –

+0

मेरा जवाब अपडेट किया गया। – TheGeekYouNeed

+3

मुझे लगता है कि यह तरह का घबराहट है लेकिन मैं समय पर कम चल रहा था, इसलिए यह फिक्स मेरे लिए काम करता था। मुझे myGridView.Rows [0] .visible = false जोड़कर ग्रिडव्यू में उस पंक्ति को "खाली" पंक्ति को छिपाना पड़ा। – marty

9

अधिक सुंदर ढंग से .. GridView का विस्तार करने और एक ShowFooterWhenEmpty संपत्ति जोड़ सकते हैं ताकि आप कस्टम कोड हर जगह लागू करने के लिए नहीं है।

Imports System.Web.UI.WebControls 
Imports System.ComponentModel 

Namespace UI.WebControls 
Public Class GridViewExtended 
    Inherits GridView 

    Private _footerRow As GridViewRow 

    <DefaultValue(False), Category("Appearance"), Description("Include the footer when the table is empty")> _ 
    Property ShowFooterWhenEmpty As Boolean 

    <DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), Browsable(False)> _ 
    Public Overrides ReadOnly Property FooterRow As GridViewRow 
     Get 
      If (Me._footerRow Is Nothing) Then 
       Me.EnsureChildControls() 
      End If 
      Return Me._footerRow 
     End Get 
    End Property 

    Protected Overrides Function CreateChildControls(ByVal dataSource As System.Collections.IEnumerable, ByVal dataBinding As Boolean) As Integer 
     Dim returnVal As Integer = MyBase.CreateChildControls(dataSource, dataBinding) 
     If returnVal = 0 AndAlso Me.ShowFooterWhenEmpty Then 
      Dim table As Table = Me.Controls.OfType(Of Table)().First 
      Me._footerRow = Me.CreateRow(-1, -1, DataControlRowType.Footer, DataControlRowState.Normal, dataBinding, Nothing, Me.Columns.Cast(Of DataControlField).ToArray, table.Rows, Nothing) 
      If Not Me.ShowFooter Then 
       _footerRow.Visible = False 
      End If 
     End If 
     Return returnVal 
    End Function 

    Private Overloads Function CreateRow(ByVal rowIndex As Integer, ByVal dataSourceIndex As Integer, ByVal rowType As DataControlRowType, ByVal rowState As DataControlRowState, ByVal dataBind As Boolean, ByVal dataItem As Object, ByVal fields As DataControlField(), ByVal rows As TableRowCollection, ByVal pagedDataSource As PagedDataSource) As GridViewRow 
     Dim row As GridViewRow = Me.CreateRow(rowIndex, dataSourceIndex, rowType, rowState) 
     Dim e As New GridViewRowEventArgs(row) 
     If (rowType <> DataControlRowType.Pager) Then 
      Me.InitializeRow(row, fields) 
     Else 
      Me.InitializePager(row, fields.Length, pagedDataSource) 
     End If 
     If dataBind Then 
      row.DataItem = dataItem 
     End If 
     Me.OnRowCreated(e) 
     rows.Add(row) 
     If dataBind Then 
      row.DataBind() 
      Me.OnRowDataBound(e) 
      row.DataItem = Nothing 
     End If 
     Return row 
    End Function 

End Class 
End Namespace 
+1

सी # संस्करण http://stackoverflow.com/questions/994895/always-show-footertemplate-even-no-data/10891744#10891744 – Aximili

3

एक अन्य समाधान, "निशान" एक विशिष्ट मूल्य के साथ उस पंक्ति है, तो RowDataBound पर पंक्ति को छिपाने हमेशा अपने डेटा स्रोत में एक डमी पंक्ति जोड़ने के लिए है।

अधिक सटीक होना,

SELECT NULL AS column1, NULL AS column2,...,NULL AS columnN, 1 AS dummyRow 

को आपकी क्वेरी के SELECT खंड, तो यूनिअन सभी पूर्ण बयान के अंत करने के लिए स्तंभ ", 0 dummyRow के रूप में" जोड़ने एक बार जब आप जगह में प्रश्न हैं (के सभी जो अपने SQLDataSource भीतर किया जा सकता है या अपने DAL वस्तु में, ग्रिड के लिए अपने कोड कुछ इस तरह दिखेगा:

Protected Sub MyGridView_RowDataBound(sender As Object, e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles MyGridView.RowDataBound 
    If (e.Row.RowType = DataControlRowType.DataRow) AndAlso (Not e.Row.DataItem Is Nothing) AndAlso (CInt(e.Row.DataItem("dummyRow")) = 1) Then 
      e.Row.Visible = False 
    End If 
End Sub 

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

1

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

Protected Sub MyGridView_RowDataBound(sender As Object, e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles MyGridView.RowDataBound 
     If (e.Row.RowType = DataControlRowType.DataRow) AndAlso (Not e.Row.DataItem Is Nothing) AndAlso (CInt(e.Row.DataItem("dummyRow")) = 1) Then 
      e.Row.Visible = False 
     If (ConditionToShowEmptyDataTemplate) Then 
      CType(e.Row.DataItem, System.Data.DataRowView).Delete() 
      CType(e.Row.Parent, System.Web.UI.WebControls.Table).Rows.Remove(e.Row) 
     End If 
End Sub 

सूचना है कि यहाँ हम DataItem पंक्ति दोनों को दूर (आवश्यक है, क्योंकि पर बाद पीठ gridview फिर से डेटा बाइंडिंग के बिना ही पुनः बनाने सकता है) और क्योंकि GridView पंक्ति में ही (आवश्यक: फिर कोड कुछ इस तरह दिखेगा इस बिंदु से पंक्ति पहले से ही ग्रिड के चाइल्डटेबल में है, जिसे हम नहीं चाहते हैं)।

अंत में, यदि छुपा डमी रिकॉर्ड आपके ग्रिडव्यू में अन्य समस्याएं उत्पन्न कर रहा है, जब उसके पास अन्य डेटा है (उदाहरण के लिए, खराब पेजिंग), तो ग्रिडव्यू में अधिक पंक्तियां होने पर आप अपनी डमी पंक्ति को हटाने के लिए समान कोड का उपयोग कर सकते हैं।

0

आदर्श रूप से आप केवल तालिका में कोई रिकॉर्ड नहीं होने पर डमी पंक्ति दिखाना चाहते हैं। तो कुछ इस तरह करने के लिए अपने SelectCommand सेट:

का चयन करें [ID], प्रथम नाम, अंतिम नाम, ग्राहकों से ईमेल संघ का चयन करें 0 [ID], '' प्रथम ',' अंतिम नाम ',' ईमेल जहां 0 में (ग्राहकों से COUNT (1) चुनें)

इस तरह अगर गिनती> 0, डमी पंक्ति वापस नहीं आती है।

ध्यान दें कि डमी पंक्ति में इसमें से कोई खंड नहीं है।

1

आप एक "खाली" पंक्ति बना सकते हैं और यह अदृश्य बनाने:

if (list != null && list.Any()) 
     { 
      gridView.DataSource = list; 
      gridView.DataBind(); 
     } 
     else 
     { 
      MyCustomClass item = new MyCustomClass(){Id = 0, Name = "(No Data Rows)", Active = false}; 
      List<MyCustomClass> l = new List<MyCustomClass>(); 
      l.Add(item); 
      gridView.DataSource = l; 
      gridView.DataBind(); 
      gridView.Rows[0].Visible = false; 
     } 
संबंधित मुद्दे