2015-01-19 4 views
0

У меня есть редактируемый GridView, в котором есть кнопка AddRow, по щелчку которой добавляется пустая строка, состоящая из text boxes.Сохранять значения текстового поля внутри gridview при нажатии кнопки

Когда я вставляю значения внутри этих textboxes и нажимаю кнопку AddRow или Delete, текстовые поля теряют свои значения.

Уверен, этого не происходит из-за postback, потому что есть кнопка Save, по щелчку которой значения обычно сохраняются.

Ниже разметка:

<asp:GridView ID="GridView1" runat="server" ShowFooter="true" AutoGenerateColumns="false" 
      OnRowDeleting="GridView1_RowDeleting"> 
      <Columns> 
       <asp:TemplateField HeaderText="Col1"> 
        <ItemTemplate> 
         <asp:TextBox runat="server" ID="txt1"></asp:TextBox> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderText="Col2"> 
        <ItemTemplate> 
         <asp:TextBox ID="txt2" runat="server"></asp:TextBox> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderText="Col3"> 
        <ItemTemplate> 
         <asp:TextBox ID="txt3" runat="server"></asp:TextBox> 
        </ItemTemplate> 
        <FooterStyle HorizontalAlign="Right" /> 
        <FooterTemplate> 
         <asp:Button ID="btnAddNewRow" runat="server" Text="AddRow" OnClick="Add" /> 
        </FooterTemplate> 
       </asp:TemplateField> 
       <asp:CommandField ButtonType="Button" ShowDeleteButton="true" /> 
      </Columns> 
     </asp:GridView> 
     <asp:Button ID="btnSavetoDB" runat="server" Text="save" OnClick="btnSavetoDB_Click" /> 

Код За:

protected void Page_Load(object sender, EventArgs e) 
     { 
      if (!IsPostBack) 
      { 
       SetInitialRow(); 
      } 
     } 
//Sets the first empty row to the grid view  
private void SetInitialRow() 
      { 
       DataTable dt = new DataTable(); 
       DataRow dr = null; 
       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["Column1"] = string.Empty; 
       dr["Column2"] = string.Empty; 
       dr["Column3"] = string.Empty; 
       dt.Rows.Add(dr); 
       //Store the DataTable in ViewState 
       ViewState["CurrentTable"] = dt; 
       GridView1.DataSource = dt; 
       GridView1.DataBind(); 
      } 
//Adds a new empty row to the grid view  
protected void Add(object sender, EventArgs e) 
      { 
       int rowIndex = 0; 
       if (ViewState["CurrentTable"] != null) 
       { 
        DataTable dtCurrentTable = (DataTable)ViewState["CurrentTable"]; 
        DataRow drCurrentRow = null; 
        if (dtCurrentTable.Rows.Count > 0) 
        { 
         for (int i = 0; i < dtCurrentTable.Rows.Count; i++) 
         { 
          //extract the TextBox values 
          TextBox box1 = (TextBox)GridView1.Rows[rowIndex].Cells[0].FindControl("txt1"); 
          TextBox box2 = (TextBox)GridView1.Rows[rowIndex].Cells[1].FindControl("txt2"); 
          TextBox box3 = (TextBox)GridView1.Rows[rowIndex].Cells[2].FindControl("txt3"); 
          drCurrentRow = dtCurrentTable.NewRow(); 
          //drCurrentRow["RowNumber"] = i + 1; 
          drCurrentRow["Column1"] = box1.Text; 
          drCurrentRow["Column2"] = box2.Text; 
          drCurrentRow["Column3"] = box3.Text; 
          rowIndex++; 
         } 
         //add new row to DataTable 
         dtCurrentTable.Rows.Add(drCurrentRow); 
         //Store the current data to ViewState 
         ViewState["CurrentTable"] = dtCurrentTable; 
         //Rebind the Grid with the current data 
         GridView1.DataSource = dtCurrentTable; 
         GridView1.DataBind(); 
        } 
       } 
       else 
       { 
        Response.Write("ViewState is null"); 
       } 
      } 
//Called on Delete Button click, which is inside a CommanField 
protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e) 
     { 
      int num = GridView1.Rows.Count; 
      int index = Convert.ToInt32(e.RowIndex); 
      if (num > 1) 
      { 
       DataTable dt = ViewState["CurrentTable"] as DataTable; 
       dt.Rows[index].Delete(); 
       ViewState["CurrentTable"] = dt; 
       GridView1.DataSource = dt; 
       GridView1.DataBind(); 
      } 
     } 

Первоначальный снимок: enter image description here

После нажатия кнопки AddRow: enter image description here

В случае, когда m Я иду не так?

Эксперты, пожалуйста, помогите.

С уважением

+0

ли EnableViewState = False для полей ввода? Если вы не попробуете это и не увидите, что произойдет – user3841709

+0

idk, если вы используете sql в своем источнике данных или нет, но если это так, вы можете попробовать позвонить команде выбора или заполнить команду перед вашей привязкой к дате. – user3841709

+0

@Anurag Хотите сохранить предыдущие данные после отправки или что-нибудь еще, дайте мне некоторое объяснение больше? – Aria

ответ

2

Проблема в том, что вы не использовали Eval в разметке

<asp:TextBox runat="server" ID="txt1" Text='<%# Eval("Column1") %>'></asp:TextBox> 

Оптимизированный код-позади. Нет необходимости ViewState

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     var table = CreateDataTable(); 
     table.Rows.Add("", "", ""); 
     BindGridView(table); 
    } 
} 

//Sets the first empty row to the grid view 
private DataTable CreateDataTable() 
{ 
    var dt = new DataTable 
    { 
     Columns = { "Column1", "Column2", "Column3" } 
    }; 
    return dt; 
} 

private void BindGridView(DataTable table) 
{ 
    GridView1.DataSource = table; 
    GridView1.DataBind(); 
} 
private DataTable PopulateTableFromGridView() 
{ 
    var table = CreateDataTable(); 
    for (int i = 0; i < GridView1.Rows.Count; i++) 
    { 
     //extract the TextBox values 
     TextBox box1 = (TextBox)GridView1.Rows[i].FindControl("txt1"); 
     TextBox box2 = (TextBox)GridView1.Rows[i].FindControl("txt2"); 
     TextBox box3 = (TextBox)GridView1.Rows[i].FindControl("txt3"); 
     table.Rows.Add(box1.Text, box2.Text, box3.Text); 
    } 
    return table; 
} 
//Adds a new empty row to the grid view 
protected void Add(object sender, EventArgs e) 
{ 
    var newTable = PopulateTableFromGridView(); 
    newTable.Rows.Add("", "", ""); 
    BindGridView(newTable); 
} 

//Called on Delete Button click, which is inside a CommanField 
protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e) 
{ 
    var dt = PopulateTableFromGridView(); 
    dt.Rows[e.RowIndex].Delete(); 
    if (dt.Rows.Count == 0) 
    { 
     dt.Rows.Add("", "", ""); 
    } 
    BindGridView(dt); 
} 

Ссылки на инлайн не выражения

  1. http://support.microsoft.com/kb/976112
  2. http://weblogs.asp.net/ahmedmoosa/embedded-code-and-inline-server-tags
+0

Привет, Навин .. Спасибо за ответ. Я попробую и дам вам знать. – Anurag

+1

HI Naveen..thanks для подробного объяснения и фрагментов кода. Он работает нормально. я просто хотел знать, что делает Эваль в основном? принял ваш ответ кстати. – Anurag

+0

обновленный ответ. google «inline expresions in asp.net» для более детального изучения – naveen