2017-10-18 1 views
0

Petit problème que j'ai avec mon code que je ne peux pas résoudre. J'ai un GridView avec un ImageButton qui devrait ajouter une nouvelle rangée vide. Pour une raison quelconque, je reçois cette erreur:C# ajouter une ligne vide à GridView

Object reference not set to an instance of an object. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:

[NullReferenceException: Object reference not set to an instance of an object.] CTI_DFC.Default.gv_Steps_RowCommand(Object sender, GridViewCommandEventArgs e) +469
System.Web.UI.WebControls.GridView.HandleEvent(EventArgs e, Boolean causesValidation, String validationGroup) +172
System.Web.UI.WebControls.GridViewRow.OnBubbleEvent(Object source, EventArgs e) +163 System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +83
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3771

C'est donc le GridView je:

<asp:GridView ID="gv_Steps" runat="server" CssClass="lbl_user" Font-Names="Verdana" Font-Size="10px" HeaderStyle-Height="23.5px" HorizontalAlign="Center" 
    RowStyle-Height="23.5px" ShowHeaderWhenEmpty="True" style="z-index: 1; left: 8px; top: 143px; position: absolute; height: 20px; width: 1178px;" AutoGenerateColumns="False" OnRowCommand="gv_Steps_RowCommand"> 
    <AlternatingRowStyle BackColor="#DCE4FF" /> 
    <Columns> 
     <asp:TemplateField HeaderText="Step" HeaderStyle-HorizontalAlign="Left" > 
      <ItemTemplate> 
       <asp:TextBox ID="txt_Step" HeaderStyle-HorizontalAlign="Left" runat="server" Width="150px" Text='<%# Bind("Step") %>'/> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Server" HeaderStyle-HorizontalAlign="Left" > 
      <ItemTemplate> 
       <asp:TextBox ID="txt_Server" HeaderStyle-HorizontalAlign="Left" runat="server" Width="150px" Text='<%# Bind("Server") %>'/> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Type" HeaderStyle-HorizontalAlign="Left" > 
      <ItemTemplate> 
       <asp:TextBox ID="txt_Type" HeaderStyle-HorizontalAlign="Left" runat="server" Width="150px" Text='<%# Bind("Type") %>'/> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Job" HeaderStyle-HorizontalAlign="Left" > 
      <ItemTemplate> 
       <asp:TextBox ID="txt_Job" HeaderStyle-HorizontalAlign="Left" runat="server" Width="150px" Text='<%# Bind("Job") %>'/> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Number" HeaderStyle-HorizontalAlign="Left" > 
      <ItemTemplate> 
       <asp:TextBox ID="txt_Number" HeaderStyle-HorizontalAlign="Left" runat="server" Width="150px" Text='<%# Bind("Number") %>'/> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="" ItemStyle-Width="15px" ItemStyle-Wrap="false"> 
      <ItemTemplate> 
       <asp:ImageButton ID="btn_AddRow" runat="server" AlternateText="Add Row" CommandArgument="<%# Container.DataItemIndex %>" CommandName="Add" ImageUrl="./Img/ADD.png" ToolTip="Add Row without Change" /> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="" ItemStyle-Width="15px" ItemStyle-Wrap="false"> 
      <ItemTemplate> 
       <asp:ImageButton ID="btn_DeleteRow" runat="server" AlternateText="Delete Row" CommandArgument="<%# Container.DataItemIndex %>" CommandName="Delete" ImageUrl="./Img/DEL.png" ToolTip="Delete Row without Change" /> 
      </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
    <HeaderStyle BackColor="#0B4DA2" Font-Bold="True" ForeColor="White" /> 
    <RowStyle Height="23px" /> 
</asp:GridView> 

Et c'est le code C# comment je suis en train de le faire:

protected void gv_Steps_RowCommand(object sender, GridViewCommandEventArgs e) 
{ 
    int intIndex = Convert.ToInt32(e.CommandArgument); //will be used for Delete 

    if (e.CommandName == "Delete" && (gv_Steps.Rows.Count > 1)) 
    { 
     //Nothing done yet 
    } 
    if (e.CommandName == "Add") 
    { 
     DataTable dt = gv_Steps.DataSource as DataTable; 
     DataRow dr = dt.NewRow(); 
     dt.Rows.Add(dr); 

     gv_Steps.DataSource = dt; 
     gv_Steps.DataBind(); 
    } 
} 

Merci pour tout conseil!

EDIT

Je comprends maintenant que mon DataTable est vide et ne fonctionne pas comme ça, mais comment puis-je GridView à DataSet et retour avec une nouvelle ligne vide? Je l'ai essayé comme celui-ci avec la même erreur:

protected void gv_Steps_RowCommand(object sender, GridViewCommandEventArgs e) 
    { 
     int intIndex = Convert.ToInt32(e.CommandArgument); //will be used for Delete 

     if (e.CommandName == "Delete" && (gv_Steps.Rows.Count > 1)) 
     { 
      //Nothing done yet 
     } 
     if (e.CommandName == "Add") 
     { 
      DataTable dt = GridviewToDataTable(); 
      DataRow dr = dt.NewRow(); 
      dt.Rows.Add(dr); 

      gv_Steps.DataSource = dt; 
      gv_Steps.DataBind(); 
     } 
    } 

private DataTable GridviewToDataTable() 
    { 
     DataTable dt = new DataTable(); 
     dt.Columns.Add(new DataColumn("Step", typeof(string))); 
     dt.Columns.Add(new DataColumn("Server", typeof(string))); 
     dt.Columns.Add(new DataColumn("Type", typeof(string))); 
     dt.Columns.Add(new DataColumn("Job", typeof(string))); 
     dt.Columns.Add(new DataColumn("Number", typeof(string))); 

     foreach (GridViewRow row in gv_Steps.Rows) 
     { 
      dt.Rows.Add(); 
      dt.Rows[row.RowIndex][0] = ((TextBox)row.FindControl("Step")).Text; 
      dt.Rows[row.RowIndex][1] = ((TextBox)row.FindControl("Server")).Text; 
      dt.Rows[row.RowIndex][2] = ((TextBox)row.FindControl("Type")).Text; 
      dt.Rows[row.RowIndex][3] = ((TextBox)row.FindControl("Job")).Text; 
      dt.Rows[row.RowIndex][4] = ((TextBox)row.FindControl("Number")).Text; 
     } 

     return dt; 
    } 

erreur que je reçois:

Object reference not set to an instance of an object. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:

[NullReferenceException: Object reference not set to an instance of an object.] CTI_DFC.Default.GridviewToDataTable() +1161
CTI_DFC.Default.gv_Steps_RowCommand(Object sender, GridViewCommandEventArgs e) +392
System.Web.UI.WebControls.GridView.HandleEvent(EventArgs e, Boolean causesValidation, String validationGroup) +172
System.Web.UI.WebControls.GridViewRow.OnBubbleEvent(Object source, EventArgs e) +163 System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +83
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3771

EDIT 2

Essayé comme ceci:

protected void gv_Steps_RowCommand(object sender, GridViewCommandEventArgs e) 
    { 
     int intIndex = Convert.ToInt32(e.CommandArgument); //will be used for Delete 

     if (e.CommandName == "Delete" && (gv_Steps.Rows.Count > 1)) 
     { 
      //Nothing done yet 
     } 
     if (e.CommandName == "Add") 
     { 
      DataTable dt = GridviewToDataTable(gv_Steps); 
      DataRow dr = dt.NewRow(); 
      dt.Rows.Add(dr); 

      gv_Steps.DataSource = dt; 
      gv_Steps.DataBind(); 
      GridviewToDataTable(gv_Steps); 
     } 
    } 
private DataTable GridviewToDataTable(GridView gv) 
    { 
     DataTable dt = new DataTable(); 
     dt.Columns.Add(new DataColumn("Step", typeof(string))); 
     dt.Columns.Add(new DataColumn("Server", typeof(string))); 
     dt.Columns.Add(new DataColumn("Type", typeof(string))); 
     dt.Columns.Add(new DataColumn("Job", typeof(string))); 
     dt.Columns.Add(new DataColumn("Number", typeof(string))); 
     foreach (GridViewRow row in gv.Rows) 
     { 
      dt.Rows.Add(); 
      dt.Rows[row.RowIndex][0] = ((TextBox)row.FindControl("Step")).Text; 
      dt.Rows[row.RowIndex][1] = ((TextBox)row.FindControl("Server")).Text; 
      dt.Rows[row.RowIndex][2] = ((TextBox)row.FindControl("Type")).Text; 
      dt.Rows[row.RowIndex][3] = ((TextBox)row.FindControl("Job")).Text; 
      dt.Rows[row.RowIndex][4] = ((TextBox)row.FindControl("Number")).Text; 
     } 
     gv.DataSource = dt; 
     gv.DataBind(); 
     return dt; 
    } 

erreur que je reçois :

Object reference not set to an instance of an object. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:

[NullReferenceException: Object reference not set to an instance of an object.] CTI_DFC.Default.GridviewToDataTable(GridView gv) +1145
CTI_DFC.Default.gv_Steps_RowCommand(Object sender, GridViewCommandEventArgs e) +407
System.Web.UI.WebControls.GridView.HandleEvent(EventArgs e, Boolean causesValidation, String validationGroup) +172
System.Web.UI.WebControls.GridViewRow.OnBubbleEvent(Object source, EventArgs e) +163 System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +83
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3771

Un autre conseil?

SOLUTION

je l'ai fait, il a obtenu fait comme ceci:

private DataTable GridviewToDataTable(GridView gv) 
    { 
     DataTable dt = new DataTable(); 
     dt.Columns.Add(new DataColumn("Step", typeof(string))); 
     dt.Columns.Add(new DataColumn("Server", typeof(string))); 
     dt.Columns.Add(new DataColumn("Type", typeof(string))); 
     dt.Columns.Add(new DataColumn("Job", typeof(string))); 
     dt.Columns.Add(new DataColumn("Number", typeof(string))); 
     foreach (GridViewRow row in gv.Rows) 
     { 
      dt.Rows.Add(); 
      dt.Rows[row.RowIndex][0] = (row.FindControl("txt_Step") as TextBox).Text; 
      dt.Rows[row.RowIndex][1] = (row.FindControl("txt_Server") as TextBox).Text; 
      dt.Rows[row.RowIndex][2] = (row.FindControl("txt_Type") as TextBox).Text; 
      dt.Rows[row.RowIndex][3] = (row.FindControl("txt_Job") as TextBox).Text; 
      dt.Rows[row.RowIndex][4] = (row.FindControl("txt_Number") as TextBox).Text; 
     } 
     lbl_Fehlermeldung.Text = dt.Rows[0][0].ToString(); 
     lbl_Fehlermeldung.Visible = true; 
     gv.DataSource = dt; 
     gv.DataBind(); 
     return dt; 
    } 
+2

'gv_Steps.DataSource' ne fonctionne que sur la charge initiale, et non sur PostBack . – VDWWD

Répondre

1

Votre source de données est vide, ce pourquoi votre DataTable est converti en objet nul, et exception est throwed

+0

Merci, mais comment puis-je obtenir mon GridView à DataTable et retour? Voir mon Edit comment je l'ai essayé .. – Tobe

+0

pouvez-vous montrer l'exception après votre montage? – olpro123

+0

Désolé, j'ai oublié celui-là, je l'ai ajouté. – Tobe

0

Votre code est bon pour vide gridview seulement. Comme vous n'incrémentez pas l'index de ligne.

Pour ajouter une nouvelle ligne à la gridview a quelques préoccupations.

Avez-vous déjà quelques datasource dans le gridview ou pas? Si vous avez précédemment datasource et que vous devez ensuite enregistrer le datasource dans viewstate et avant d'ajouter une nouvelle ligne, vous devez extraire les données précédentes dans le gridview, puis ajouter une nouvelle ligne.

Suivez ci-dessous le code

*** ligne initiale d'abord dans datasource ensemble protégé viewstate

private void SetInitialRow() 
{ 
    DataTable dt = new DataTable(); 
    DataRow dr = null; 
    dt.Columns.Add(new DataColumn("RowNumber", typeof(string))); 
    dt.Columns.Add(new DataColumn("Column1", typeof(string))); 
    dt.Columns.Add(new DataColumn("Column2", typeof(string))); 
    dt.Columns.Add(new DataColumn("Column3", typeof(string))); 
    dr = dt.NewRow(); 
    dr["RowNumber"] = 1; 
    dr["Column1"] = string.Empty; 
    dr["Column2"] = string.Empty; 
    dr["Column3"] = string.Empty; 
    dt.Rows.Add(dr); 
    //dr = dt.NewRow(); 

    //Store the DataTable in ViewState 
    ViewState["CurrentTable"] = dt; 

    Gridview1.DataSource = dt; 
    Gridview1.DataBind(); 
} 

*** mis en page_load

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 
     SetInitialRow(); 
    } 
} 

*** Ajouter nouvelle ligne à gridview

private void AddNewRowToGrid() 
{ 
    int rowIndex = 0; 

    if (ViewState["CurrentTable"] != null) 
    { 
     DataTable dtCurrentTable = (DataTable)ViewState["CurrentTable"]; 
     DataRow drCurrentRow = null; 
     if (dtCurrentTable.Rows.Count > 0) 
     { 
      for (int i = 1; i <= dtCurrentTable.Rows.Count; i++) 
      { 
       //extract the TextBox values 
       TextBox box1 = (TextBox)Gridview1.Rows[rowIndex].Cells[1].FindControl("TextBox1"); 
       TextBox box2 = (TextBox)Gridview1.Rows[rowIndex].Cells[2].FindControl("TextBox2"); 
       TextBox box3 = (TextBox)Gridview1.Rows[rowIndex].Cells[3].FindControl("TextBox3"); 

       drCurrentRow = dtCurrentTable.NewRow(); 
       drCurrentRow["RowNumber"] = i + 1; 

       dtCurrentTable.Rows[i - 1]["Column1"] = box1.Text; 
       dtCurrentTable.Rows[i - 1]["Column2"] = box2.Text; 
       dtCurrentTable.Rows[i - 1]["Column3"] = box3.Text; 

       rowIndex++; 
      } 
      dtCurrentTable.Rows.Add(drCurrentRow); 
      ViewState["CurrentTable"] = dtCurrentTable; 

      Gridview1.DataSource = dtCurrentTable; 
      Gridview1.DataBind(); 
     } 
    } 
    else 
    { 
     Response.Write("ViewState is null"); 
    } 

    //Set Previous Data on Postbacks 
    SetPreviousData(); 
} 

*** Définir les données précédentes

private void SetPreviousData() 
{ 
    int rowIndex = 0; 
    if (ViewState["CurrentTable"] != null) 
    { 
     DataTable dt = (DataTable)ViewState["CurrentTable"]; 
     if (dt.Rows.Count > 0) 
     { 
      for (int i = 0; i < dt.Rows.Count; i++) 
      { 
       TextBox box1 = (TextBox)Gridview1.Rows[rowIndex].Cells[1].FindControl("TextBox1"); 
       TextBox box2 = (TextBox)Gridview1.Rows[rowIndex].Cells[2].FindControl("TextBox2"); 
       TextBox box3 = (TextBox)Gridview1.Rows[rowIndex].Cells[3].FindControl("TextBox3"); 

       box1.Text = dt.Rows[i]["Column1"].ToString(); 
       box2.Text = dt.Rows[i]["Column2"].ToString(); 
       box3.Text = dt.Rows[i]["Column3"].ToString(); 

       rowIndex++; 
      } 
     } 
    } 
} 

*** appeler cliquez sur le bouton

protected void ButtonAdd_Click(object sender, EventArgs e) 
    { 
     AddNewRowToGrid(); 
    } 

lien Sorce https://www.aspsnippets.com/Articles/Add-new-Row-to-GridView-on-Button-Click-in-ASPNet.aspx