2017-08-28 1 views
0

J'ai donc une page C# avec un GridView. Pour une raison quelconque, après avoir ajouté l'étiquette et le modèle pour l'édition, lorsque je clique sur le bouton de mise à jour dans la colonne d'édition, la GridView disparaît et aucun des enregistrements n'est modifié. Je sais que j'ai besoin de databind les valeurs dans la boîte d'édition une fois que l'utilisateur clique sur la mise à jour, mais je ne sais pas comment. Quelqu'un peut-il donner des suggestions?GridView disparaît sur le bouton de mise à jour Cliquez sur, ne met pas à jour l'enregistrement

Voici mon code.

public partial class CMSWebParts_Custom_Development_DevWebPart : 
CMSAbstractWebPart 
{ 

public string paramId; 

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     ViewState["RefUrl"] = Request.UrlReferrer.ToString(); 
    } 
    string urlString = Request.UrlReferrer.ToString(); 
    paramId = HttpUtility.ParseQueryString(urlString).Get("Theid"); 

    DispatchNumberLabel.Text = getDispatchNumber(); 
    //TerminalLabel.Text = getTerminal(); 
    DispatchInfoIdLabel.Text = getDispatchInfoId(); 
    DriverNameLabel.Text = getDriverName(); 
} 

protected string getDispatchInfoId() 
{ 
    string result = DriverDropDownList.SelectedValue; 
    return result; 
} 

protected string getDispatchNumber() 
{ 
    string result = paramId; 
    return result; 
} 

protected string getTerminal() 
{ 
    string result; 
    string connectionString = ""; 
    using (var con = new SqlConnection(connectionString)) 
    { 
     var sql = "Select Terminal from Form_IntranetSharpTransit_DispatchInfo where ([Dispatch] = @Dispatch)";   
     using (var cmd = new SqlCommand(sql, con)) 
     { 
      cmd.Parameters.AddWithValue("@Dispatch", getDispatchNumber()); 
      con.Open(); 
      result = (string)cmd.ExecuteScalar(); 
     } 
    } 
    return result; 
} 

protected string getDriverName() 
{ 
    string result; 
    string connectionString = ""; 
    using (var con = new SqlConnection(connectionString)) 
    { 
     var sql = "Select Driver from Form_IntranetSharpTransit_DispatchInfo WHERE ([DispatchInfoID] = @DispatchInfoId)"; 
     using (var cmd = new SqlCommand(sql, con)) 
     { 
      cmd.Parameters.AddWithValue("@DispatchInfoId", getDispatchInfoId()); 
      con.Open(); 
      result = (string)cmd.ExecuteScalar(); 
     } 
    } 
    return result; 
} 
} 

Et voici mon code derrière.

<%@ Control Language="C#" AutoEventWireup="true" 
CodeFile="~/CMSWebParts/Custom/Development/DevWebPart.ascx.cs" 
Inherits="CMSWebParts_Custom_Development_DevWebPart" %> 
<%--<script runat="server"> 

protected void Page_Load(object sender, EventArgs e) 
{ 

} 
</script>--%>Dispatch Number: 
<asp:Label ID="DispatchNumberLabel" runat="server"></asp:Label> 
<p> 
Terminal: 
<asp:Label ID="TerminalLabel" runat="server"></asp:Label> 
</p> 
<p> 
Current 
Dispatch Info ID: 
<asp:Label ID="DispatchInfoIdLabel" runat="server"></asp:Label> 
</p> 
<p> 
&nbsp;Driver Name: 
<asp:Label ID="DriverNameLabel" runat="server"></asp:Label> 
</p> 
<asp:DropDownList ID="DriverDropDownList" runat="server" AutoPostBack="True" 
DataSourceID="DriverListData" DataTextField="Select Driver" 
DataValueField="Column1"> 
</asp:DropDownList> 
<asp:SqlDataSource ID="DriverListData" runat="server" ConnectionString="<%$ 
ConnectionStrings:ConnectionString %>" ProviderName="<%$ 
ConnectionStrings:ConnectionString.ProviderName %>" SelectCommand="Select 
'', 'Select Driver' as 'Select Driver' 
from Form_IntranetSharpTransit_DispatchInfo 
Union 
SELECT  DispatchInfoID, Driver + ' - ' + CAST(DispatchInfoID AS 
varchar(50)) AS Expr1 
FROM   Form_IntranetSharpTransit_DispatchInfo 
WHERE  (Dispatch = ?) AND (DaysOff NOT LIKE '%' + (SELECT DispatchDay 
FROM Form_IntranetSharpTransit_DailyDispatch Where DailydispatchID = ?) + 
'%') AND (Status LIKE 'Available')"> 
<SelectParameters> 
    <asp:QueryStringParameter Name="?" QueryStringField="Theid" /> 
    <asp:QueryStringParameter Name="?" QueryStringField="Theid" /> 
</SelectParameters> 
</asp:SqlDataSource> 
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
AutoGenerateEditButton="True" DataSourceID="Store1Data" EditIndex="0" 
OnSelectedIndexChanged="GridView1_SelectedIndexChanged"> 
<Columns> 
    <asp:TemplateField HeaderText="Store 1:"> 
     <EditItemTemplate> 
      <asp:TextBox ID="TextBox1" runat="server" AutoPostBack="True" 
OnTextChanged="TextBox1_TextChanged" Text='<%# Bind("[Store Number]") %>'> 
</asp:TextBox> 
     </EditItemTemplate> 
     <ItemTemplate> 
      <asp:Label ID="Label1" runat="server" Text='<%# Bind("[Store 
Number]") %>'></asp:Label> 
     </ItemTemplate> 
    </asp:TemplateField> 
</Columns> 
</asp:GridView> 
<asp:SqlDataSource ID="Store1Data" runat="server" ConnectionString="<%$ 
ConnectionStrings:ConnectionString %>" ProviderName="<%$ 
ConnectionStrings:ConnectionString.ProviderName %>" SelectCommand="SELECT  
(SELECT  Store 
        FROM   Form_IntranetSharpTransit_TourPlan 
        WHERE  (TourPlanID = 
Form_IntranetSharpTransit_DispatchInfo_1.Store1)) AS 'Store Number', 
Location1, Pro1, Store1Export 
FROM   Form_IntranetSharpTransit_DispatchInfo AS 
Form_IntranetSharpTransit_DispatchInfo_1 
WHERE  (DispatchInfoID = ?)"> 
<SelectParameters> 
    <asp:ControlParameter ControlID="DriverDropDownList" Name="?" 
PropertyName="SelectedValue" /> 
</SelectParameters> 
</asp:SqlDataSource> 

Tout ce que je veux, c'est afficher la table avec un bouton d'édition. Lorsque le bouton d'édition est cliqué, je veux que l'étiquette dans la table devienne une boîte d'édition (comme mon modèle le montre). Une fois que l'utilisateur a modifié la zone d'édition, il peut cliquer sur le bouton de mise à jour, valider la modification dans la base de données et actualiser la table pour afficher les valeurs modifiées.

Cela semble extrêmement simple, mais j'ai lutté avec lui depuis environ 3 mois maintenant.

Aidez-nous s'il vous plaît.

+0

La première chose qui vient à l'esprit ... vous définissez 'Store1Data' sur la charge? Je pense que 'Store1Data' est réinitialisé sur' Postback'. –

+0

Je ne définis rien sur la charge, sauf pour certaines variables locales que je tire de l'URL et de certaines requêtes. Est-ce que le moyen de remédier à cela serait de mettre quelque chose comme "Store1Data.DataBind()" être approprié? –

+0

'

Répondre

0

Voici un exemple minimal de ce que vous essayez d'accomplir. Bien que je dois admettre, le Microsoft Documentation est venu très pratique pour cet extrait.

Default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="UpdateGridViewOnPostBack_45921943.Default" %> 

<!DOCTYPE html> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
     <asp:GridView runat="server" ID="dgv1" AutoGenerateEditButton="true" OnRowEditing="dgv1_RowEditing" OnRowUpdating="dgv1_RowUpdating"> 
      <Columns> 
       <asp:TemplateField> 
        <ItemTemplate> 
         <asp:Label runat="server" ID="gvCol1Label" Text='<%#Bind("field1") %>'></asp:Label> 
        </ItemTemplate> 
        <EditItemTemplate> 
         <asp:TextBox runat="server" ID="gvCol1Txtbx" Text='<%# Bind("field1") %>'></asp:TextBox> 
        </EditItemTemplate> 
       </asp:TemplateField> 
      </Columns> 
     </asp:GridView> 
    </div> 
    </form> 
</body> 
</html> 

Default.aspx.cs

using System; 
using System.Web.UI.WebControls; 
using System.Collections.ObjectModel; 

namespace UpdateGridViewOnPostBack_45921943 
{ 
    public partial class Default : System.Web.UI.Page 
    { 
     static ObservableCollection<dgvEntry> dgv1Source; 

     protected void Page_Load(object sender, EventArgs e) 
     { 
      if (!IsPostBack) 
      { 
       //Not a postback 
       dgv1Source = new ObservableCollection<dgvEntry>(); 
       dgv1Source.Add(new dgvEntry { field1 = "the field coming from the data source" }); 
       initializeDGV(IsPostBack); 
      } 
      else 
      { 
       //is a postback 
       if (dgv1Source == null) 
       { 
        dgv1Source = new ObservableCollection<dgvEntry>(); 
       } 
       initializeDGV(IsPostBack); 
      } 
     } 

     private void initializeDGV(bool isPostback) 
     { 
      dgv1.DataSource = dgv1Source; 
      dgv1.AutoGenerateColumns = false; 
      if (!isPostback) 
      { 
       dgv1.DataBind(); 
      } 
     } 

     protected void dgv1_RowEditing(object sender, GridViewEditEventArgs e) 
     { 
      dgv1.EditIndex = e.NewEditIndex; 
      dgv1.DataBind(); 
     } 

     protected void dgv1_RowUpdating(object sender, GridViewUpdateEventArgs e) 
     { 

      GridViewRow row = dgv1.Rows[e.RowIndex]; 
      dgv1Source[e.RowIndex].field1 = ((TextBox)row.Cells[1].Controls[1]).Text; 
      dgv1.EditIndex = -1; 
      dgv1.DataBind(); 
     } 
    } 

    public class dgvEntry 
    { 
     public string field1 { get; set; } 
     //public string field2 { get; set; } 
     //public string field3 { get; set; } 
    } 
} 
+0

cela ensemble, je vais jeter un coup d'oeil! –

+0

Après avoir étudié cela, j'ai pu implémenter la logique dans mon code et avoir réussi à écrire dans la base de données. J'ai une question cependant; en faisant cela, j'ai été forcé de mettre Store1Data.UpdateCommand dans le code derrière. J'ai utilisé ceci: "Store1Data.UpdateCommand =" INSERT blah blah VALUES (@DispatchInfoId) "mais je dois alors comprendre comment définir @DispatchInfoId (la variable dans la requête de mise à jour que je cours) au résultat de la méthode getDispatchInfoId(), est-ce possible? –

+0

@MarleyStacy, Quelque chose comme ceci devrait fonctionner 'dataadapt.UpdateCommand.Parameters.AddWithValue (" @ DispatchInfoId ", getDispatchInfoId());' –