C# 当用户单击gridview中的select按钮时插入数据

C# 当用户单击gridview中的select按钮时插入数据,c#,asp.net,gridview,C#,Asp.net,Gridview,我有一个网格视图如下 <asp:GridView ID="gvDoctorList" runat="server" AutoGenerateColumns="False" DataSourceID="SqlDataSource1" AllowPaging="True" AllowSorting="True" OnSelectedIndexChanged="gvDoctor

我有一个网格视图如下

 <asp:GridView ID="gvDoctorList" runat="server" AutoGenerateColumns="False" DataSourceID="SqlDataSource1" 
                            AllowPaging="True" AllowSorting="True" 
                             OnSelectedIndexChanged="gvDoctorList_SelectedIndexChanged" OnRowCommand="gvDoctorList_RowCommand" OnRowDataBound="gvDoctorList_RowDataBound">
                            <Columns>
                                <asp:TemplateField>
                                    <ItemTemplate>
                                        <%--<asp:CheckBox runat="server" ID="chk" OnCheckedChanged="chk_CheckedChanged" AutoPostBack="true" />--%>
                                        <asp:Label runat="server" ID="lblPID" Visible="false" Text='<%# Eval("PatientId") %>'></asp:Label>
                                        <asp:Button ID="btnSelect" runat="server" Text="Select" CommandArgument='<%# Eval("PatientId") %>' CommandName = "Select" />
                                    </ItemTemplate>

                                </asp:TemplateField>

                                <asp:BoundField DataField="PatientId" HeaderText="PatientId" SortExpression="PatientId" />
                                <asp:BoundField DataField="firstname" HeaderText="firstname" SortExpression="firstname" />
                                <asp:BoundField DataField="lastname" HeaderText="lastname" SortExpression="lastname" />

                                <asp:BoundField DataField="sex" HeaderText="sex" SortExpression="sex" />

                            </Columns>
                        </asp:GridView>
                        <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:MyDatabaseConnectionString %>" 
                            SelectCommand="SELECT [PatientId],[firstname], [lastname], [sex] FROM [PatientDetails]"></asp:SqlDataSource>

<asp:Button ID="btnformatric" runat="server" Text="formatric3d" OnClick="btnformatric_Click" />
我想插入使用select按钮从gridview中选择的值,并在button click事件中插入所选值…但是上面的代码不起作用


有人能给我一些其他的建议吗?如果可能的话,这些代码如何…你能给我代码吗…非常感谢

我想你有兴趣根据GridView中选择的
PatientID
值插入一条记录

您要做的是首先将GridView的
DataKeyNames
属性设置为
PatientID
,如下所示:

<asp:GridView ID="gvDoctorList" runat="server" DataKeyNames="PatientID" ...>

当然,在执行上述操作之前,您应该检查以确保用户已从网格中选择患者(即,
gvDoctorList.SelectedIndex>=0
)。

您可以添加一个隐藏字段,并将Gridview的行索引保存在隐藏字段中。在btinformatric_中,单击可以按索引获取行并获取数据。标记:

 <asp:HiddenField ID="hdnRowIndex" runat="server" Value ="" />
 <asp:Button ID="btnformatric" runat="server" Text="formatric3d" OnClick="btnformatric_Click" />
B信息点击方式:

protected void btnformatric_Click(object sender, EventArgs e)
{
    int rowIndex = 0;
    if (int.TryParse(hdnRowIndex.Value, out rowIndex))
    {
        //Get the row
        GridViewRow row = gvDoctorList.Rows[rowIndex];            
        Button btn = (Button)row.FindControl("Select");

        if (btn != null)
        {

            string pIDstr = Convert.ToString(Session["PatientId"]);
            string exam = ((Button)sender).Text;

            SqlCommand cmd = new SqlCommand("INSERT INTO [dbo].[PatExam]([PId],[Exam]) VALUES (@pid,@exam)", con);

            if (con.State == ConnectionState.Closed)
            {
                con.Open();
            }
            try
            {
                cmd.Connection = con;
                cmd.Parameters.AddWithValue("@pid", pIDstr);
                cmd.Parameters.AddWithValue("@exam", exam);

                cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                Response.Write("Error Occured: " + ex.Message.ToString());
            }
            finally
            {
                con.Close();
                cmd.Dispose();
            }
        }
    }
}

我尝试了你的代码,我想告诉你,我没有按钮,没有imagebutton,所以我在GridViewRow gvr=(GridViewRow)(((button)e.CommandSource.NamingContainer)行中做了更改;但当我调试按钮点击事件时,btn的值仍然为空…会有什么问题。。。。?
string pIDstr = gvDoctorList.SelectedValue.ToString();
 <asp:HiddenField ID="hdnRowIndex" runat="server" Value ="" />
 <asp:Button ID="btnformatric" runat="server" Text="formatric3d" OnClick="btnformatric_Click" />
protected void gvDoctorList_RowCommand(object sender, GridViewCommandEventArgs e)
        {

            if (e.CommandName == "Select")
            {
                int pID = Convert.ToInt32(e.CommandArgument);
                Session["PatientId"] = Convert.ToString(e.CommandArgument);
                //Server.Transfer("Patientstaticformatrix.aspx");
                GridViewRow gvr = (GridViewRow)(((ImageButton)e.CommandSource).NamingContainer);
                hdnRowIndex.Value = gvr.RowIndex.ToString();
... ... ...     ... ... ...     ... ... ...     ... ... ...     ... ... ... 
protected void btnformatric_Click(object sender, EventArgs e)
{
    int rowIndex = 0;
    if (int.TryParse(hdnRowIndex.Value, out rowIndex))
    {
        //Get the row
        GridViewRow row = gvDoctorList.Rows[rowIndex];            
        Button btn = (Button)row.FindControl("Select");

        if (btn != null)
        {

            string pIDstr = Convert.ToString(Session["PatientId"]);
            string exam = ((Button)sender).Text;

            SqlCommand cmd = new SqlCommand("INSERT INTO [dbo].[PatExam]([PId],[Exam]) VALUES (@pid,@exam)", con);

            if (con.State == ConnectionState.Closed)
            {
                con.Open();
            }
            try
            {
                cmd.Connection = con;
                cmd.Parameters.AddWithValue("@pid", pIDstr);
                cmd.Parameters.AddWithValue("@exam", exam);

                cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                Response.Write("Error Occured: " + ex.Message.ToString());
            }
            finally
            {
                con.Close();
                cmd.Dispose();
            }
        }
    }
}