Mettre à jour la database SQL à partir de GridView TemplateField DropDownLists

Cela m'a torturé pendant les 2 derniers jours et j'espère désespérément que quelqu'un puisse donner des conseils. Je n'ai vraiment aucune idée d'où je vais mal, donc tout ce que quelqu'un peut faire pour aider serait absolument fantastique.

SQLDataSource1 est une vue. Il récupère les PK des champs de tbl_Job et les traduit en noms. Également attrape les keys aussi bien. SQLOrigin est une source de données pour tbl_origin

SQL Viewtbl_Jobtbl_origin

J'ai le button Modifier activé via CommandField afin que les users peuvent modifier une ligne.

Ce sont mes SqlDataSources :

 <asp:SqlDataSource ID="SQLDataSource1" runat="server" ConnectionSsortingng="<%$ ConnectionSsortingngs:HSEProjRegConnectionSsortingng1 %>" SelectCommand="SELECT * FROM v_job_details WHERE Project_ID=@id" UpdateCommand="UPDATE [tbl_Job] SET [Job_Origin_ID]=@originID,[Job_Department_ID]=@departmentID,[Job_Priority_ID]=@priorityID,[Job_Status_ID]=@statusID WHERE [Job_ID]=@Job_ID" OnUpdated="SQLDataSource1_Updated"> <SelectParameters> <asp:QuerySsortingngParameter Name="id" Type="Int32" QuerySsortingngField="id" /> </SelectParameters> <UpdateParameters> <asp:Parameter Name="originID" Type="Int32" /> <asp:Parameter Name="departmentID" Type="Int32" /> <asp:Parameter Name="priorityID" Type="Int32" /> <asp:Parameter Name="statusID" Type="Int32" /> <asp:Parameter Name="Job_ID" Type="Int32" /> </UpdateParameters> <asp:SqlDataSource ID="SQLOrigin" runat="server" ConnectionSsortingng="<%$ ConnectionSsortingngs:HSEProjRegConnectionSsortingng1 %>" SelectCommand="SELECT * FROM [tbl_origin] WHERE Active = 1"></asp:SqlDataSource> 

J'utilise TemplateFields et ItemTemplates pour afficher le contenu d'une table dans un DropDownList . C'est le code pour cela est ci-dessous. Veuillez noter que je n'ai pas ajouté tous les TemplateFields pour économiser de l'espace. Ils sont identiques à l'exception des references de champs.

 <asp:Label ID="Label1" runat="server" /> <asp:GridView ID="GridView1" runat="server" AllowPaging="True" AllowSorting="False" DataSourceID="SQLDataSource1" AutoGenerateColumns="False" DataKeyNames="Job_ID"> <Columns> <asp:BoundField HeaderText="Job ID" DataField="Job_ID" InsertVisible="False" ReadOnly="True" /> <asp:TemplateField HeaderText="Reference/Origin"> <EditItemTemplate> <asp:DropDownList ID="DropDownList2" runat="server" DataSourceID="SQLOrigin" DataTextField="Name" DataValueField="origin_ID" SelectedValue='<%# Bind("origin_ID") %>' Width="150px" OnSelectedIndexChanged="DropDownList2_SelectedIndexChanged"> </asp:DropDownList> </EditItemTemplate> <ItemTemplate> <asp:Label ID="Label1" runat="server" Text='<%# Bind("origin") %>'></asp:Label> </ItemTemplate> </asp:TemplateField> <asp:CommandField ShowEditButton="true" /> </Columns> </asp:GridView> 

Et voici ce que j'ai dans mon Code Behind:

  protected void Page_Load(object sender, EventArgs e) { } protected void DropDownList2_SelectedIndexChanged(object sender, EventArgs e) { DropDownList ddl = sender as DropDownList; if (ddl == null) { return; } GridViewRow gvr = ddl.NamingContainer as GridViewRow; if (gvr == null) { return; } SQLDataSource1.UpdateParameters["originID"].DefaultValue = GridView1.DataKeys[gvr.RowIndex]["Job_ID"].ToSsortingng(); } protected void SQLDataSource1_Updated(object sender, SqlDataSourceStatusEventArgs e) { if ((e.Exception == null) && e.AffectedRows.Equals(1)) { Label1.Text = "Data successfully updated!"; GridView1.DataBind(); } } 

Lorsque j'appuie sur Edit dans GridView , je mets à jour TOUS les champs et sélectionne Update et reçois cette erreur:

 The UPDATE statement conflicted with the FOREIGN KEY constraint "FK_tbl_Job_tbl_status". The conflict occurred in database "HSE_proj", table "dbo.tbl_status", column 'Status_ID'. The statement has been terminated. 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.Data.SqlClient.SqlException: The UPDATE statement conflicted with the FOREIGN KEY constraint "FK_tbl_Job_tbl_status". The conflict occurred in database "HSE_proj", table "dbo.tbl_status", column 'Status_ID'. The statement has been terminated. 

Si j'essaie de mettre à jour seulement 1 champ, j'obtiens l'erreur ci-dessous. Dans le cas ci-dessous, j'essayais de modifier le champ ORIGIN et le champ DEPARTMENT était juste à côté. Les détails de l'erreur changent en fonction de la colonne que j'essaie de modifier, mais l'erreur elle-même est la même.

 Cannot insert the value NULL into column 'Job_Department_ID', table 'HSE_proj.dbo.tbl_Job'; column does not allow nulls. UPDATE fails. The statement has been terminated. 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.Data.SqlClient.SqlException: Cannot insert the value NULL into column 'Job_Department_ID', table 'HSE_proj.dbo.tbl_Job'; column does not allow nulls. UPDATE fails. The statement has been terminated. 

EDIT Lorsque j'ai ajouté AutoPostback="true" aux DropDownLists , j'ai commencé à recevoir l'erreur ci-dessous. Je ne comprends pas d'où vient la valeur NULL. Je vais insert un point d'arrêt et voir si je peux voir ce qui ne va pas.

 Cannot insert the value NULL into column 'Job_Origin_ID', table 'HSE_proj.dbo.tbl_Job'; column does not allow nulls. UPDATE fails. The statement has been terminated. 

EDIT 2 Modifié le code derrière le suivant. Lorsque j'insère un point d'arrêt et que je le suis, il récupère les valeurs qu'il devrait mais il me donne toujours une erreur NULL .

  protected void DropDownList2_SelectedIndexChanged(object sender, EventArgs e) { DropDownList ddl = sender as DropDownList; if (ddl == null) { return; } GridViewRow gvr = ddl.NamingContainer as GridViewRow; if (gvr == null) { return; } DropDownList ddlOrigin = (DropDownList)sender; GridViewRow row = (GridViewRow)ddlOrigin.NamingContainer; Control control = row.FindControl("DropDownList2"); if (ddlOrigin != null) { SQLDataSource1.UpdateParameters["originID"].DefaultValue = ddlOrigin.SelectedValue; SQLDataSource1.UpdateParameters["updateID"].DefaultValue = GridView1.DataKeys[gvr.RowIndex]["Job_ID"].ToSsortingng(); } } 

EDIT 3 Toujours essayer de faire fonctionner ça. Pensé à essayer d'get les valeurs dans Page_Load et avait une méthode d' using là pour append des parameters avec des valeurs, mais je ne pouvais pas faire fonctionner cela. Le code n'avait aucun sens alors j'ai abandonné. Tous les exemples que je peux find en ligne indiquent l'utilisation de OnSelectedIndexChanged et AutoPostBack="true" qui, lors de l'utilisation des points d'arrêt, renvoie les valeurs OnSelectedIndexChanged , mais pour une raison quelconque, lorsque j'essaye de mettre à jour la table avec ces valeurs,

Je ne pourrais pas lire ceci correctement. Dans Locals , si je vais dans this naviguez vers les SQLDataSource , UpdateParameters , Non-Public members , base , _collectionItems , je vois les parameters que j'ai mis en place dans le code et originID a le bon PK de tbl_origin . Je ne suis pas trop expérimenté dans le debugging et pour moi, je me request si un problème pourrait être qu'ils sont dans Non-Public members ce qui signifie qu'il est possible que UpdateCommand ne puisse pas accéder aux valeurs même si le code les trouve? J'espère que cela à du sens.

 The UPDATE statement conflicted with the FOREIGN KEY constraint "FK_tbl_Job_tbl_status". The conflict occurred in database "HSE_proj", table "dbo.tbl_status", column 'Status_ID'. The statement has been terminated 

Ce que cela signifie essentiellement, c'est que cette mise à jour entraînerait une violation de key FOREIGN. Il y a des ressortingctions sur votre database que pour chaque élément de la table que vous travaillez sur un élément doit exister dans une autre table spécifique. Dans ce cas, StatusID

Dans la deuxième partie de votre question:

 Cannot insert the value NULL into column 'Job_Department_ID', table 'HSE_proj.dbo.tbl_Job'; column does not allow nulls. UPDATE fails. The statement has been terminated. 

Je suppose que cela a quelque chose à voir avec les champs nullables. Vous ne pouvez pas avoir certains champs nuls donc c'est évidemment get des valeurs qui ne sont rien. Je voudrais mettre un point d'arrêt dans leur et passer à travers pour voir ce qui est appelé lorsque vous mettez à jour.