C# 如何通过单击制裁按钮向gridview中列出的每个用户发送电子邮件?

C# 如何通过单击制裁按钮向gridview中列出的每个用户发送电子邮件?,c#,asp.net,gridview,C#,Asp.net,Gridview,我在approval.aspx页面上创建了一个gridview。我使用的是VS 2014和SQL Server 2014 <asp:GridView ID="gv_pending_requests" runat="server" AutoGenerateColumns="False" Width="95%" CellPadding="1" CellSpacing="2"> <Columns> <asp:BoundField HeaderTex

我在approval.aspx页面上创建了一个gridview。我使用的是VS 2014和SQL Server 2014

<asp:GridView ID="gv_pending_requests" runat="server" AutoGenerateColumns="False" Width="95%" CellPadding="1" CellSpacing="2">
    <Columns>
        <asp:BoundField HeaderText="Requested By" DataField="username" />                                
        <asp:BoundField HeaderText="No. of Days" DataField="total_days" />
        <asp:BoundField HeaderText="Type of Leave" DataField="leave_type" />
        <asp:BoundField HeaderText="Reason" DataField="reason" />
        <asp:BoundField HeaderText="Starting" DataField="start_date"/>
        <asp:BoundField HeaderText="Ending" DataField="end_date" />

        <asp:TemplateField HeaderText="Sanction">
            <ItemTemplate>
                <asp:Button ID="btn_apprv" Text="Sanction" runat="server" OnClick="btn_apprv" />
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Deny">
            <ItemTemplate>
                <asp:Button ID="btn_deny" Text="Deny" runat="server" OnClick="btn_deny"/>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

//现在,来自.cs文件的代码:

lbl_uid.Text = Convert.ToString(Session["Username"]);
string connectionstring = @"Data Source=server;Integrated Security=true   Initial Catalog=E_M_S"; 

SqlDataReader rdr;
DataTable dt = new DataTable();
dt.Columns.Add("Requested By");
dt.Columns.Add("Type of Leave");
dt.Columns.Add("Reason");
dt.Columns.Add("Starting");
dt.Columns.Add("Ending");
dt.Columns.Add("No. of Days");

DataRow dr;
SqlConnection conn = new SqlConnection(connectionstring);

SqlCommand cmd = new SqlCommand("select leave_type,reason,start_date,end_date from Leave where status='" + lbl_status.Text + "'", conn);

cmd.CommandType = CommandType.Text;
using (conn)
{
    conn.Open();
    rdr = cmd.ExecuteReader();
    while (rdr.Read())
    {
        dr = dt.NewRow();
        dr["Requested By"] = rdr["username"].ToString();
        dr["Type of Leave"] = rdr["leave_type"].ToString();
        dr["Reason"] = rdr["reason"].ToString();
        dr["Starting"] = rdr["start_date"].ToString();
        dr["Ending"] = rdr["end_date"].ToString();
        dr["No. of Days"] = rdr["total_days"].ToString();

        dt.Rows.Add(dr);
        dt.AcceptChanges();
        gv_pending_requests.DataSource = dt;
        gv_pending_requests.DataBind();
        conn.Close();
    }
} 

//Button for sending the E-Mail
protected void btn_apprv(object sender, EventArgs e)
{
    Response.Write("<script type='javascript'>alert('The leave has been sanctioned, and mail has been sent to inform the employee of the same.');</script>");
}
lbl_uid.Text=Convert.ToString(会话[“用户名]);
字符串连接字符串=@“数据源=服务器;集成安全性=真实初始目录=电子邮件”;
SqlDataReader-rdr;
DataTable dt=新的DataTable();
dt.列。添加(“请求方”);
dt.列。添加(“休假类型”);
dt.列。添加(“原因”);
dt.列。添加(“起始”);
dt.列。添加(“结尾”);
dt.列。添加(“天数”);
数据行dr;
SqlConnection conn=新的SqlConnection(connectionstring);
SqlCommand cmd=new SqlCommand(“从休假中选择休假类型、原因、开始日期、结束日期,其中状态=”+lbl\u status.Text+”,conn);
cmd.CommandType=CommandType.Text;
使用(康涅狄格州)
{
conn.Open();
rdr=cmd.ExecuteReader();
while(rdr.Read())
{
dr=dt.NewRow();
dr[“请求者”]=rdr[“用户名”].ToString();
dr[“休假类型”]=rdr[“休假类型”].ToString();
dr[“Reason”]=rdr[“Reason”].ToString();
dr[“start”]=rdr[“start_date”].ToString();
dr[“end”]=rdr[“end_date”].ToString();
dr[“天数”]=rdr[“总天数”].ToString();
dt.Rows.Add(dr);
dt.AcceptChanges();
gv_pending_requests.DataSource=dt;
gv_挂起_请求。数据绑定();
康涅狄格州关闭();
}
} 
//用于发送电子邮件的按钮
受保护的无效btn_Approv(对象发送方,事件参数e)
{
回复。写下(“警告(请假已被批准,并已发送邮件通知员工)。”;
}
问题1:下面显示了指向该行的错误:-gv_pending_requests.DataSource=dt

“在所选数据源上找不到名为‘username’的字段或属性”

问题2:我希望根据为该行按下的按钮向每个用户发送邮件。如何使用该邮件代码定义点击事件

请原谅我遗漏的细节,如果有的话。请帮助我解决此错误。

对于您的问题1:

在SQL Select语句中,您没有为
用户名选择:

SqlCommand cmd = new SqlCommand("select leave_type,reason,start_date,end_date from Leave where status='" + lbl_status.Text + "'", conn);
相反,此代码应为:

SqlCommand cmd = new SqlCommand("select username,leave_type,reason,start_date,end_date from Leave where status='" + lbl_status.Text + "'", conn);
否则-如错误消息所述-您使用的
DataReader
在数据库结果中找不到列
username
。 如果您转到数据库并直接在那里启动
SQL语句
,您将看到您没有找回用户名,那么您可以对此进行测试

此外,您还使用
请求的列
定义了
数据表

dt.Columns.Add("Requested By");
但如果您现在查看,您将看到
数据字段
被定义为“用户名”:

包含足够的代码以允许其他人重现问题。对于 关于这方面的帮助,请阅读如何创建一个最小的、完整的、有效的示例

你没有提供任何研究或一个最小的例子来告诉我们你至少试图找到一个解决方案

因此,我只会给你提示你的“问题”,如果你有任何问题,然后关于一个不工作的代码,请张贴一个新的问题


使用第一个链接获取应将
电子邮件发送到的用户,第二个链接提供发送
电子邮件的逻辑。祝你好运

谢谢你的回复。关于包含用户名,我确实使用它重新运行了查询并运行了它。在databind语句中仍然存在相同的错误。我更正了您的建议,并且针对所有数据字段。现在,错误是“{”在读卡器关闭时调用Read的尝试无效。“}”,而(rdr.Read())这一行没有终止。刚刚解决了!这是一个愚蠢的错误。必须将数据绑定和关闭语句移出while循环。非常感谢你的帮助!
<asp:BoundField HeaderText="Requested By" DataField="username" />