2010-04-26 4 views

Répondre

2

avoir une lecture de this article

Vous pouvez également définir votre propre interface utilisateur personnalisée pour la ligne de données vide en utilisant le EmptyDataTemplate property.

+0

En fait je préfère 'EmptyDataTemplate' plus que Bind Empty' DataSet' à 'GridView', je le fais et il y a beaucoup de problèmes et c'est pourquoi ils mettent réellement' EmptyDataTemplate'. Je blâmais Microsoft pour ne pas implémenter une telle fonctionnalité, mais lier le DataSet vide à GridView n'est pas la meilleure façon de le faire. –

1

Vous pouvez également le faire en affectant une ligne factice au DataSource de la grille. Par défaut, la source de données sera remplie avec la ligne factice. Donc, la grille montrera le bas de page & rangée factice ainsi. Pour masquer la ligne, vous pouvez ajouter un champ factice pour l'affichage ou non du contrôle. Et lie ce champ à la propriété Visible du contrôle. Enfin, lorsque vous ajoutez la ligne réelle à la source de données ... Supprimez la ligne factice que vous avez créée.

Exemple - Source:

<asp:GridView ID="grdQualify" runat="server" Width="100%" AutoGenerateColumns="False" ShowFooter="true" 
         EnableModelValidation="True"> 
         <Columns> 
          <asp:TemplateField HeaderText="Qualifying Exam"> 
           <ItemTemplate> 
            <asp:TextBox ID="txtQualifyingExam" runat="server" Text='<%# Eval("QualifyingExam") %>' Visible='<%# Eval("ShowVisible") %>'></asp:TextBox> 
           </ItemTemplate> 
           <FooterTemplate> 
            <asp:TextBox ID="txtQualifyingExamF" runat="server"></asp:TextBox> 
           </FooterTemplate> 
          </asp:TemplateField> 
          <asp:TemplateField HeaderText="Roll Number"> 
           <ItemTemplate> 
            <asp:TextBox ID="txtRollNumber" runat="server" Text='<%# Eval("RollNumber") %>' Visible='<%# Eval("ShowVisible") %>'></asp:TextBox> 
           </ItemTemplate> 
           <FooterTemplate> 
            <asp:TextBox ID="txtRollNumberF" runat="server"></asp:TextBox> 
           </FooterTemplate> 
          </asp:TemplateField> 
          <asp:TemplateField HeaderText="Admission Round"> 
           <ItemTemplate> 
            <asp:TextBox ID="txtAdmissionRound" runat="server" Text='<%# Eval("AdmissionRound") %>' Visible='<%# Eval("ShowVisible") %>'></asp:TextBox> 
           </ItemTemplate> 
           <FooterTemplate> 
            <asp:TextBox ID="txtAdmissionRoundF" runat="server"></asp:TextBox> 
           </FooterTemplate> 
          </asp:TemplateField> 
          <asp:TemplateField HeaderText="Marks Obtained"> 
           <ItemTemplate> 
            <asp:TextBox ID="txtMarksObtained" runat="server" Text='<%# Eval("MarksObtained") %>' Visible='<%# Eval("ShowVisible") %>'></asp:TextBox> 
           </ItemTemplate> 
           <FooterTemplate> 
            <asp:TextBox ID="txtMarksObtainedF" runat="server"></asp:TextBox> 
           </FooterTemplate> 
          </asp:TemplateField> 
          <asp:TemplateField HeaderText="Marks Out of"> 
           <ItemTemplate> 
            <asp:TextBox ID="txtMarksOutOf" runat="server" Text='<%# Eval("MarksOutOf") %>' Visible='<%# Eval("ShowVisible") %>'></asp:TextBox> 
           </ItemTemplate> 
           <FooterTemplate> 
            <asp:TextBox ID="txtMarksOutOfF" runat="server"></asp:TextBox> 
           </FooterTemplate> 
          </asp:TemplateField> 
          <asp:TemplateField HeaderText="Percentage"> 
           <ItemTemplate> 
            <asp:TextBox ID="txtPercentage" runat="server" Text='<%# Eval("Percentage") %>' Visible='<%# Eval("ShowVisible") %>'></asp:TextBox> 
           </ItemTemplate> 
           <FooterTemplate> 
            <asp:TextBox ID="txtPercentageF" runat="server"></asp:TextBox> 
           </FooterTemplate> 
          </asp:TemplateField> 
          <asp:TemplateField HeaderText="Remarks"> 
           <ItemTemplate> 
            <asp:TextBox ID="txtRemarks" runat="server" Text='<%# Eval("Remarks") %>' Visible='<%# Eval("ShowVisible") %>'></asp:TextBox> 
           </ItemTemplate> 
           <FooterTemplate> 
            <asp:TextBox ID="txtRemarksF" runat="server"></asp:TextBox> 
           </FooterTemplate> 
          </asp:TemplateField> 
          <asp:TemplateField> 
           <ItemTemplate> 
            <asp:Button ID="btnDeleteQualify" runat="server" Text="Delete" 
             Visible='<%# Eval("ShowVisible") %>' onclick="btnDeleteQualify_Click"></asp:Button> 
           </ItemTemplate> 
           <FooterTemplate> 
            <asp:Button ID="btnAddQualify" runat="server" Text="Add" 
             onclick="btnAddQualify_Click"></asp:Button> 
           </FooterTemplate> 
          </asp:TemplateField> 
         </Columns> 
        </asp:GridView> 

Exemple - Code:

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 

      if (ViewState["QualifyDetails"] == null) 
       ViewState["QualifyDetails"] = new List<Entity_StudentAcademicQualify>(); 
      GridDataBindQualify((List<Entity_StudentAcademicQualify>)ViewState["QualifyDetails"]); 
     } 
    } 


    private void GridDataBindQualify(List<Entity_StudentAcademicQualify> list) 
    { 
     if (list.Count == 0) 
     { 
      Entity_StudentAcademicQualify studentQualify = new Entity_StudentAcademicQualify(); 

      studentQualify.ShowVisible = false; 
      studentQualify.QualifyingExam = string.Empty; 
      studentQualify.RollNumber = string.Empty; 
      studentQualify.AdmissionRound = string.Empty; 
      studentQualify.MarksObtained = 0; 
      studentQualify.MarksOutOf = 0; 
      studentQualify.Percentage = 0; 
      studentQualify.Remarks = string.Empty; 

      list.Add(studentQualify); 
     } 
     else 
     { 
      list.RemoveAt(0); 
     } 

     grdQualify.DataSource = list; 
     grdQualify.DataBind(); 

     ViewState["QualifyDetails"] = list; 
    } 

    protected void btnAddQualify_Click(object sender, EventArgs e) 
    { 
     GridViewRow row = (GridViewRow)((Button)sender).Parent.Parent; 

     List<Entity_StudentAcademicQualify> studentQualifys = 
      (List<Entity_StudentAcademicQualify>)ViewState["QualifyDetails"]; 

     Entity_StudentAcademicQualify studentQualify = new Entity_StudentAcademicQualify(); 

     studentQualify.ShowVisible = true; 
     studentQualify.QualifyingExam = ((TextBox)row.FindControl("txtQualifyingExamF")).Text; 
     studentQualify.RollNumber = ((TextBox)row.FindControl("txtRollNumberF")).Text; 
     studentQualify.AdmissionRound = ((TextBox)row.FindControl("txtAdmissionRoundF")).Text; 
     studentQualify.MarksObtained = Convert.ToInt32(((TextBox)row.FindControl("txtMarksObtainedF")).Text); 
     studentQualify.MarksOutOf = Convert.ToInt32(((TextBox)row.FindControl("txtMarksOutOfF")).Text); 
     studentQualify.Percentage = Convert.ToInt32(((TextBox)row.FindControl("txtPercentageF")).Text); 
     studentQualify.Remarks = ((TextBox)row.FindControl("txtRemarksF")).Text; 

     studentQualifys.Add(studentQualify); 

     GridDataBindQualify(studentQualifys); 
    } 

    protected void btnDeleteQualify_Click(object sender, EventArgs e) 
    { 
     List<Entity_StudentAcademicQualify> studentQualifys = 
      (List<Entity_StudentAcademicQualify>)ViewState["QualifyDetails"]; 

     studentQualifys.RemoveAt(((GridViewRow)((Button)sender).Parent.Parent).RowIndex); 

     GridDataBindQualify(studentQualifys); 
    } 
1

J'ai lu beaucoup de messages en ligne à ce sujet et à la fin de celui-ci, je suis venu avec ma propre solution qui répond mes besoins, et j'espère que les besoins des autres, y compris cette question.

La nécessité de montrer en-tête/pied de page peut être parce que 1) Je veux que l'utilisateur de voir la structure de la grille, et 2) Je veux utiliser le pied de page pour ajouter de nouvelles données à la table.

Par conséquent, il ne suffit pas de montrer «aucune donnée disponible».

Donc, ma solution est de tester si des données sont disponibles. Sinon, créez la structure de la source de données et remplissez les champs obligatoires d'une ligne avec les valeurs par défaut. Ceci est important car si vous liez une source de données à la grille lorsque des champs comme boolean et dates sont vides, vous aurez des erreurs 'DBNull'. Puis lier cette nouvelle source de données à la grille. puis cachez la rangée, dans cette séquence.

Protected Sub BindGrid() 
    con = New SqlConnection("mainLocal") 
    Dim da As New SqlDataAdapter("SELECT * FROM Test", con) 
    Dim dt As New DataTable() 
    da.Fill(dt) 

    dim rows as integer = dt.Rows.Count 
    If rows = 0 Then 
     Dim dr As DataRow = Nothing 

     dr = dt.NewRow() 
     dr("isActive") = False 
     dr("Dated") = Date.Now() 
     dt.Rows.Add(dr) 
    End If 

    Me.TestGridView.DataSource = dt 
    Me.TestGridView.DataBind() 
    If rows = 0 Then Me.TestGridView.Rows(0).Visible = False 
End Sub 

Je suppose que beaucoup plus simple, plus court, plus propre!

Questions connexes