0

私は新しいASP.NET開発者であり、会社向けにWebベースの提案ボックスプログラムを開発しています。このプログラムでは、従業員が安全に関する提案を送信できます。現在、私はこのシステムの管理部分に取り組んでいます。

管理者は、GridViewコントロールにリストされているすべての提案を表示できます。GridViewの最後の列に、ステータスが表示されます。管理者がこれらの提案のいずれかのステータスをクリックすると、新しいポップアップウィンドウ(asp.net ajax ModalPopUpExtender)が表示され、アクション、承認済みなどのすべての可能なステータスが一覧表示されます。これらのステータスの1つを選択すると、提案のステータスがデータベースで更新されます。コードを書きましたが、それでも提案のステータスは更新されません。

それで、それを修正するのを手伝ってくれませんか?

参考までに、私は次のデータベース設計を持っています。

Employee Table: Username, Name...
SafetySuggestionsLog: ID, Title, Description, Username, StatusID
SafetySuggestionsStatus: ID, Status

ASP.NETコード:

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <ContentTemplate>
        <asp:GridView ID="GridView1" runat="server" AllowPaging="True" 
                        AllowSorting="True" AutoGenerateColumns="False" DataKeyNames="ID" 
                        width="900px" CssClass="mGrid" 
                        DataSourceID="SqlDataSource1" 
                        OnRowDataBound="GridView1_RowDataBound">
            <AlternatingRowStyle BackColor="White" ForeColor="#284775" CssClass="alt" />
            <HeaderStyle Font-Bold = "True" ForeColor="Black" Height="20px"/> 
            <Columns>
                <asp:BoundField DataField="ID" HeaderText="ID" InsertVisible="False" 
                    ReadOnly="True" SortExpression="ID" />
                <asp:BoundField DataField="Title" HeaderText="Title" SortExpression="Title" />
                <asp:BoundField DataField="Description" HeaderText="Description" 
                    SortExpression="Description" />
                <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
                <asp:BoundField DataField="Username" HeaderText="Username" 
                    SortExpression="Username" />
                <asp:BoundField DataField="DivisionShortcut" HeaderText="DivisionShortcut" 
                    SortExpression="DivisionShortcut" />
                <asp:BoundField DataField="Type" HeaderText="Type" SortExpression="Type" />

                <%-- This to make status be opened and edited through the Ajax ModalPopUp Window --%>
                <asp:TemplateField HeaderText="Status">
                    <ItemTemplate>
                        <asp:LinkButton runat="server" ID="lnkSuggestionStatus" Text='<%#Eval("Status")%>'
                                        OnClick="lnkSuggestionStatus_Click">
                        </asp:LinkButton>
                    </ItemTemplate>
                </asp:TemplateField>

                <%--<asp:HyperLinkField HeaderText="Status" 
                    SortExpression="Status" />--%>
            </Columns>
            <RowStyle HorizontalAlign="Center" />
        </asp:GridView>

        <asp:Button runat="server" ID="btnModalPopUp" style="display:none" />

        <AjaxToolkit:ModalPopUpExtender ID="modalPopUpExtender1"
                                        runat="server" 
                                        TargetControlID="btnModalPopUp" 
                                        PopupControlID="pnlPopUp" 
                                        BackgroundCssClass="popUpStyle"
                                        PopupDragHandleControlID="panelDragHandle" 
                                        OkControlID="OKButton">
        </AjaxToolkit:ModalPopUpExtender>

        <asp:Panel runat="server" ID="pnlPopUp">

                    <asp:RadioButtonList ID="StatusList" runat="server" RepeatColumns="1" RepeatDirection="Vertical"
                                            RepeatLayout="Table" TextAlign="Left" DataSourceID="SuggestionStatusDataSource"
                                            DataTextField="Status" DataValueField="ID">
                        <asp:ListItem id="option1" runat="server" Value="ACTIONED" />
                        <asp:ListItem id="option2" runat="server" Value="APPROVED" />
                        <asp:ListItem id="option3" runat="server" Value="PENDING" />
                        <asp:ListItem id="option4" runat="server" Value="TRANSFERRED" />
                    </asp:RadioButtonList>
                    <asp:SqlDataSource ID="SuggestionStatusDataSource" runat="server"
                                        ConnectionString="<%$ ConnectionStrings:testConnectionString %>"
                                        SelectCommand="SELECT * FROM [SafetySuggestionsStatus]"></asp:SqlDataSource>

                    <asp:Button ID="confirmButton" runat="server" Text="Confirm" 
                                OnClientClick="javascript:return confirm('Are you sure you want to send an email notification about the safety suggestion to the owner?')" 
                                OnClick="btnSendStatus_Click" />

            <asp:Button ID="OKButton" runat="server" Text="Close" />
        </asp:Panel>
        </ContentTemplate>
        </asp:UpdatePanel>

コードビハインド:

protected void lnkSuggestionStatus_Click(object sender, EventArgs e)
    {
        LinkButton lnkSuggestionStatus = sender as LinkButton;

//var safetySuggestionsId=

        //get reference to the row selected 
        GridViewRow gvrow = (GridViewRow)lnkSuggestionStatus.NamingContainer;


        //set the selected index to the selected row so that the selected row will be highlighted
        GridView1.SelectedIndex = gvrow.RowIndex;

        //show the modalPopUp
        modalPopUpExtender1.Show();
    }

public void btnSendStatus_Click(object sender, EventArgs e) {
        var statusID = StatusList.SelectedValue;

        string connString = "Data Source=localhost\\sqlexpress;Initial Catalog=psspdbTest;Integrated Security=True";
        //For updating the status of the safety suggestion
        string updateCommand = "UPDATE SafetySuggestionsStatus SET ID= @statusID where ID=@SafetySuggestionsID"";
        using (SqlConnection conn = new SqlConnection(connString))
        {
            conn.Open();
            //using (SqlCommand cmd = new SqlCommand(cmdText, conn))
            using (SqlCommand cmd = new SqlCommand(updateCommand, conn))
            {

                cmd.Parameters.AddWithValue("@ID", statusID);
                cmd.ExecuteNonQuery();
            }
        }

        SendSuggestionStatusToUser(statusID);
    }

アップデート:

コードをデバッグすると、次のエラーが発生しました。

SqlException was unhandled by user code 
 Must declare the scalar variable "@SafetySuggestionsID"

更新2:

あなたが提案したようにコードを変更しました:

protected void lnkSuggestionStatus_Click(object sender, EventArgs e)
    {
        LinkButton lnkSuggestionStatus = sender as LinkButton;

        //var safetySuggestionsId = 

        //get reference to the row selected 
        GridViewRow gvrow = (GridViewRow)lnkSuggestionStatus.NamingContainer;

        //set the selected index to the selected row so that the selected row will be highlighted
        GridView1.SelectedIndex = gvrow.RowIndex;

        HiddenField1.Value = gvrow.RowIndex.ToString();

        //show the modalPopUp
        modalPopUpExtender1.Show();
    }

    public void btnSendStatus_Click(object sender, EventArgs e) {

        var statusID = StatusList.SelectedValue;

        string connString = "Data Source=localhost\\sqlexpress;Initial Catalog=psspdbTest;Integrated Security=True";
        //For updating the status of the safety suggestion
        string updateCommand = "UPDATE SafetySuggestionsLog SET StatusID= @statusID where ID=@SafetySuggestionsID";
        using (SqlConnection conn = new SqlConnection(connString))
        {
            conn.Open();
            using (SqlCommand cmd = new SqlCommand(updateCommand, conn))
            {
                cmd.Parameters.AddWithValue("@ID", Convert.ToInt32(statusID));
                cmd.Parameters.AddWithValue("@SafetySuggestionsID", Convert.ToInt32(HiddenField1.Value));
                cmd.ExecuteNonQuery();
            }
            //reset the value of hiddenfield
            HiddenField1.Value = "-1";
        }

        //SendSuggestionStatusToUser(statusID);
    }

ただし、コードのデバッグ中に、次のエラーが発生しました。

スカラー変数"@statusID"を宣言する必要があります

すでに定義しているのに、なぜこのエラーが発生するのかわかりません。

更新3:

GridView1.DataBind()選択した提案の更新されたステータスでGridViewを更新するために追加しましたが、機能しません。

public void btnSendStatus_Click(object sender, EventArgs e) {

        var statusID = StatusList.SelectedValue;

        string connString = "Data Source=localhost\\sqlexpress;Initial Catalog=psspdbTest;Integrated Security=True";
        //For updating the status of the safety suggestion
        string updateCommand = "UPDATE SafetySuggestionsLog SET StatusID= @statusID where ID=@SafetySuggestionsID";
        using (SqlConnection conn = new SqlConnection(connString))
        {
            conn.Open();
            using (SqlCommand cmd = new SqlCommand(updateCommand, conn))
            {
                cmd.Parameters.AddWithValue("@statusID", Convert.ToInt32(statusID));
                cmd.Parameters.AddWithValue("@SafetySuggestionsID", Convert.ToInt32(HiddenField1.Value));
                cmd.ExecuteNonQuery();
            }
            //reset the value of hiddenfield
            HiddenField1.Value = "-1";
        }

        GridView1.DataBind();

        //SendSuggestionStatusToUser(statusID);
    }

更新4: 以下を追加しましたが、機能しませんでした。

public void btnSendStatus_Click(object sender, EventArgs e) {

        var statusID = StatusList.SelectedValue;

        string connString = "Data Source=localhost\\sqlexpress;Initial Catalog=psspdbTest;Integrated Security=True";
        //For updating the status of the safety suggestion
        string updateCommand = "UPDATE SafetySuggestionsLog SET StatusID= @statusID where ID=@SafetySuggestionsID";
        using (SqlConnection conn = new SqlConnection(connString))
        {
            conn.Open();
            using (SqlCommand cmd = new SqlCommand(updateCommand, conn))
            {
                cmd.Parameters.AddWithValue("@statusID", Convert.ToInt32(statusID));
                cmd.Parameters.AddWithValue("@SafetySuggestionsID", Convert.ToInt32(HiddenField1.Value));
                cmd.ExecuteNonQuery();
            }
            //reset the value of hiddenfield
            HiddenField1.Value = "-1";
        }

        UpdatePanel1.Update();
        GridView1.DataBind();


        //SendSuggestionStatusToUser(statusID);
    }
4

3 に答える 3

1

私はSafetySuggestionsIDどこにも定義されていません...uはそれを次のように定義していますstatusID

また、パラメータを追加するときは、参照していIDます...これらの修正を行うか、クエリのコードを更新してください。

string updateCommand = "UPDATE SafetySuggestionsStatus SET ID= @statusID";  // where??
        using (SqlConnection conn = new SqlConnection(connString))  
        {  
            conn.Open();  
            //using (SqlCommand cmd = new SqlCommand(cmdText, conn))  
            using (SqlCommand cmd = new SqlCommand(updateCommand, conn))  
            {  

                cmd.Parameters.AddWithValue("@statusID", statusID);  
                cmd.ExecuteNonQuery();  
            }  
        }  

更新

"UPDATE SafetySuggestionsStatus SET ID= @statusID where ID=@SafetySuggestionsID"";

2つのパラメーターを定義しましたが、パラメーターコレクションに1つだけ追加しています。

cmd.Parameters.AddWithValue("@ID", statusID); // id should be statusID
// also add @SafetySuggestionsID

更新2:イベントハンドラー でlnkSuggestionStatus_Click、最初の列(ID)の値を取得し、safetySuggestionsIdなどのクラス変数に格納します。

次に、btnSendStatus_Clickイベントハンドラーで、次を追加するだけです。

using (SqlConnection conn = new SqlConnection(connString))   
        {   
            conn.Open();   
            //using (SqlCommand cmd = new SqlCommand(cmdText, conn))   
            using (SqlCommand cmd = new SqlCommand(updateCommand, conn))   
            {   

                cmd.Parameters.AddWithValue("@statusID ", statusID); 
                cmd.Parameters.AddWithValue("@SafetySuggestionsID", safetySuggestionsId);   
                cmd.ExecuteNonQuery();   
            }   
        } 

アップデート3: これはテストされていないので、以下が機能することを願っています...:

  1. モーダルポップアップパネルに非表示フィールドを追加します->

  2. 次に、lnkSuggestionStatus_Clickイベントハンドラーに次を追加します。

    hiddenRowIndex.Value = row.Cells [1] .Text; //必要に応じてトリミング

  3. 次に、イベントハンドラーに保存するときにbtnSendStatus_Click、次を追加するだけです。

           ...
           ...   
            {   
    
                cmd.Parameters.AddWithValue("@statusID ", statusID); 
                cmd.Parameters.AddWithValue("@SafetySuggestionsID", 
                                            Convert.ToInt32(hiddenRowIndex.Value));   
                cmd.ExecuteNonQuery();   
            } 
            // reset hiddenRowIndex
            hiddenRowIndex.Value = "-1";
        } 
    
于 2012-07-03T07:39:39.130 に答える
0

最後に、私はそれを修正する方法を知っています。私の問題は、選択した行のDataKeyに割り当てるように指定せずに、選択した行のインデックスにすぐに割り当てるHiddenFieldにありました。

lnkSuggestionStatus_Clickメソッドでこれを変更する必要がありました。

HiddenField1.Value = GridView1.DataKeys[gvrow.RowIndex].Value.ToString();
于 2012-07-04T08:02:29.070 に答える