我是一名新的ASP.NET开发人员,我正在为我的公司开发一个基于Web的建议框程序,员工可以在其中提交任何安全建议。现在,我正在研究该系统的管理部分。
管理员将能够看到GridView控件中列出的所有建议。在GridView的最后一列中,状态将列在那里。当管理员点击其中一个建议的状态时,将出现一个新的弹出窗口(asp.net ajax ModalPopUpExtender),列出所有可能的状态,例如:actioned,approved ...等。当Admin选择其中一个状态,建议的状态将在数据库中更新。 我编写了代码,但仍未更新建议的状态,
你能帮我修改吗?
仅供参考,我有以下数据库设计:
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);
}
答案 0 :(得分:1)
我在任何地方都没有看到SafetySuggestionsID
...你已将其定义为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个参数,但在参数colleciton中只添加了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: 希望以下工作,因为这是未经测试的......:
在模态弹出式面板中添加隐藏字段 - &gt;
然后在您的lnkSuggestionStatus_Click
事件处理程序中添加:
hiddenRowIndex.Value = row.Cells [1] .Text; //必要时修剪
然后当您保存时,在btnSendStatus_Click
事件处理程序中,您只需添加:
...
...
{
cmd.Parameters.AddWithValue("@statusID ", statusID);
cmd.Parameters.AddWithValue("@SafetySuggestionsID",
Convert.ToInt32(hiddenRowIndex.Value));
cmd.ExecuteNonQuery();
}
// reset hiddenRowIndex
hiddenRowIndex.Value = "-1";
}
答案 1 :(得分:0)
看看这个示例项目
http://www.codeproject.com/Articles/17722/GridView-with-a-single-ModalPopupExtender-Panel-fo
http://mattberseth.com/blog/2007/07/modalpopupextender_example_for.html
http://thinkofdotnet.blogspot.com/2012/05/edit-update-gridview-with-ajax.html
答案 2 :(得分:0)
最后,我知道如何解决它。我的问题在于HiddenField,我将其立即分配给所选行的索引,而没有指定将其分配给该行的DataKey。
我只需要在lnkSuggestionStatus_Click方法中修改它:
HiddenField1.Value = GridView1.DataKeys[gvrow.RowIndex].Value.ToString();