2013-07-04 92 views
0

我已经搜索了两天了,无法为我的问题找到解决方案。我正在使用Visual Studio编写与数据库连接的Web部件。当点击编辑按钮时,GridView消失

所以我做了一个GridView来显示数据库中列出的一些数据,用户可以编辑和更新数据。在你看到GridView之前,你必须点击按钮“加载表”。但是当我点击GridView上的“编辑”时,GridView消失并且只有当我再次单击按钮“加载表”时才显示,并且GridView处于编辑模式。

ASP

<asp:Button ID="btnload" runat="server" Text="load table" 
      onclick="btnload_Click" /> 
<asp:GridView ID="gridtable" runat="server" BackColor="White" 
       BorderColor="#CC9966" BorderStyle="None" BorderWidth="1px" 
       CellPadding="4" EnableModelValidation="True" 
       OnRowCancelingEdit="gridtable_RowCancelingEdit" 
       OnRowEditing="gridtable_RowEditing" 
       OnRowUpdating="gridtable_RowUpdating" > 
    <FooterStyle BackColor="#FFFFCC" ForeColor="#330099" /> 
    <HeaderStyle BackColor="#990000" Font-Bold="True" ForeColor="#FFFFCC" /> 
    <PagerStyle BackColor="#FFFFCC" ForeColor="#330099" HorizontalAlign="Center" /> 
    <RowStyle BackColor="White" ForeColor="#330099" /> 
    <SelectedRowStyle BackColor="#FFCC66" Font-Bold="True" ForeColor="#663399" /> 
    <Columns> 
    <asp:TemplateField HeaderText="P_number"> 
     <ItemTemplate> 
     <%#Eval("P_number")%> 
     </ItemTemplate> 
     <EditItemTemplate> 
     <asp:TextBox ID="textbox1" runat="server" Text='<%#Eval("P_number")%>'> 
     </asp:TextBox> 
     </EditItemTemplate> 
    </asp:TemplateField> 
    <asp:TemplateField HeaderText="lastname"> 
     <ItemTemplate> 
     <%#Eval("lastname")%> 
     </ItemTemplate> 
     <EditItemTemplate> 
     <asp:TextBox ID="textbox2" runat="server" Text='<%#Eval("lastname")%>'> 
     </asp:TextBox> 
     </EditItemTemplate> 
    </asp:TemplateField> 
    <asp:TemplateField HeaderText="PN_ch"> 
     <ItemTemplate> 
     <%#Eval("PN_ch")%> 
     </ItemTemplate> 
     <EditItemTemplate> 
     <asp:TextBox ID="textbox3" runat="server" Text='<%#Eval("PN_ch")%>'> 
     </asp:TextBox> 
     </EditItemTemplate> 
    </asp:TemplateField> 
    <asp:TemplateField HeaderText="lastname_ch"> 
     <ItemTemplate> 
     <%#Eval("lastname_ch")%> 
     </ItemTemplate> 
     <EditItemTemplate> 
     <asp:TextBox ID="textbox4" runat="server" Text='<%#Eval("lastname_ch")%>'> 
     </asp:TextBox> 
     </EditItemTemplate> 
    </asp:TemplateField> 
    <asp:TemplateField HeaderText="workplace"> 
     <ItemTemplate> 
     <%#Eval("workplace")%> 
     </ItemTemplate> 
     <EditItemTemplate> 
     <asp:TextBox ID="textbox5" runat="server" Text='<%#Eval("workplace")%>'> 
     </asp:TextBox> 
     </EditItemTemplate> 
    </asp:TemplateField> 
    </Columns> 
</asp:GridView> 

C#

public SqlDataSource datasource; 

protected void Page_Load(object sender, EventArgs e) 
{ 

} 

protected void btnload_Click(object sender, EventArgs e) 
{   

    openConnection(getconstring()); 
    gridtable.AutoGenerateColumns = false; 
    gridtable.AutoGenerateEditButton = true; 
    datasource = new SqlDataSource(getconstring(), "SELECT * FROM T_Employees"); 
    BindData(); 
} 

public void BindData() 
{ 

    try 
    { 
     gridtable.DataSource = datasource; 
     gridtable.DataBind(); 
    } 
    catch (Exception e) 
    { 
     //Do something 
    } 
} 

protected void gridtable_RowEditing(object sender, GridViewEditEventArgs e) 
{ 

    gridtable.EditIndex = e.NewEditIndex; 
    BindData(); 
} 

protected void gridtable_RowUpdating(object sender, GridViewUpdateEventArgs e) 
{ 

    //get EditIndex 
    GridViewRow row = gridtable.Rows[e.RowIndex]; 

    // save changes 
    string pnumber = ((row.Cells[1].Controls[0]).ToString()); 
    string lastname = ((row.Cells[2].Controls[0]).ToString()); 
    string pn_ch = ((row.Cells[3].Controls[0]).ToString()); 
    string lastname_ch = ((row.Cells[4].Controls[0]).ToString()); 
    string workplace = ((row.Cells[5].Controls[0]).ToString()); 

    //Update 
    datasource.UpdateCommand = "UPDATE T_Employees SET P_number='"+pnumber+"', lastname='" 
           +lastname+"', PN_ch='"+pn_ch+"', lastname_ch='" 
           +lastname_ch+"', workplace='"+workplace+"'"; 
    datasource.Update(); 

    //reset EditIndex 
    gridtabelle.EditIndex = -1; 

    //Bind data 
    BindData(); 
} 

protected void gridtable_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e) 
{ 

    gridtable.EditIndex = -1; 
    BindData(); 
} 
+0

您是否启用了viewstate?如果没有viewstate,那么GridView会重置为在每个帖子后面清空,除非您再次使用相同的数据绑定它。 – user1429080

回答

2

您需要将数据源存储在会话中的按钮点击:

protected void btnload_Click(object sender, EventArgs e) 
    {   
      openConnection(getconstring()); 
      gridtable.AutoGenerateColumns = false; 
      gridtable.AutoGenerateEditButton = true; 
      datasource = new SqlDataSource(getconstring(), "SELECT * FROM T_Employees"); 
      Session["datasource "] = datasource 
      BindData(); 
    } 

您绑定然后改成这样:

public void BindData() 
    { 
     try 
     { 
      gridtable.DataSource = Session["datasource "] ; 
      gridtable.DataBind(); 

     } 
     catch (Exception e) 
     { 
      //Do something 
     } 
    } 

您还需要将其添加到web.config中:

<system.web> 
     <pages enableSessionState="true"> 
</system.web> 

或者这个页面:

<%@Page enableSessionState="true"> 
+0

我试过你的解决方案,但我得到一个错误,我必须启用会话状态。 Control Language =“C#”AutoEventWireup =“true”EnableSessionState =“true”似乎不起作用 – user2508738

+0

您可以使用viewstate而不是session来存储数据 –

0

你可能只是声明你的数据源,如您的aspx文件和你完成。如果你需要在点击按钮后绑定你的网格,那么你必须存储某个地方(例如viewstate)一个标志(布尔值)来指示你的网格是否必须被绑定。然后只在该标志为真时绑定网格。 根本不需要使用会话。

如:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!isPostBack){ 
     ViewState["FLAG"] = false; 
    } 
    else{ 
     if ((bool)ViewState["FLAG"]) BindData(); 
    } 
} 

protected void btnload_Click(object sender, EventArgs e) 
{   
    ViewState["FLAG"] = true; 
} 

寻找@以前的答案,请考虑,即使你选择的ViewState或Session(每一种都有自己的优势/劣势),你并不需要存储的数据ridundant。在你的情况下,只需要一点就足够了,因为你有代码 - 在你的页面中 - 建立/绑定数据源而不是保存它。

相关问题