SQL Server 如何将一个值放入GridView中的TextBox?

b1zrtrql  于 2022-12-17  发布在  其他
关注(0)|答案(1)|浏览(148)

当在单选按钮列表RbCompleted中选择“是”时,如何将查询的值放入文本框TbHoursCompleted?
我确信到目前为止我所做的一切都是不正确的,我甚至不知道如何引用TextBox来给它赋值。
谢谢你的帮助。
.aspx:

<AlternatingRowStyle BackColor="White" />
            <Columns>
                <asp:CommandField ShowEditButton="True" UpdateText="Save" ShowSelectButton="True" />
                <asp:BoundField DataField="TrainingID" HeaderText="Training ID" InsertVisible="False" ReadOnly="True" SortExpression="TrainingID" Visible="True" />
                <asp:BoundField DataField="AttendeeID" HeaderText="Attendee ID" InsertVisible="False" ReadOnly="True" SortExpression="AttendeeID" Visible="True" />
                <asp:BoundField DataField="DisplayName" HeaderText="Attendee Name" SortExpression="DisplayName" ItemStyle-CssClass="colPad" Visible="True" ReadOnly="True" />

                <asp:TemplateField HeaderText="Completed" SortExpression="Completed" ControlStyle-CssClass="colPad">
                    <EditItemTemplate>
                        <asp:RadioButtonList ID="RbCompleted" runat="server" Text='<%# Bind("Completed") %>' OnSelectedIndexChanged="RbCompleted_SelectedIndexChanged">
                            <asp:ListItem>Yes</asp:ListItem>
                            <asp:ListItem>No</asp:ListItem>
                            <asp:ListItem>Pending</asp:ListItem>
                        </asp:RadioButtonList>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="Label1" runat="server" Text='<%# Bind("Completed") %>'></asp:Label>
                    </ItemTemplate>
                    <ControlStyle CssClass="colPad"></ControlStyle>
                </asp:TemplateField>

                <asp:TemplateField HeaderText="Hours Completed" SortExpression="HoursCompleted">
                    <EditItemTemplate>
                        <asp:TextBox ID="TbHoursCompleted" runat="server" Text='<%# Bind("HoursCompleted", "{0:n2}") %>' onkeypress="return num(this);" ></asp:TextBox>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="LbHoursCompleted" runat="server" Text='<%# Bind("HoursCompleted", "{0:n2}") %>'></asp:Label>
                    </ItemTemplate>
                    <ControlStyle Width="40px" />
                </asp:TemplateField>
            </Columns>
        </asp:GridView>

C编号:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        SqlConnection DBConn = new SqlConnection(ConfigurationManager.ConnectionStrings["StaffRosterConnectionString"].ConnectionString);
        string sql = "SELECT Hours FROM Training WHERE TrainingID = @TrainingID";
        SqlCommand DBCmd = new SqlCommand(sql, DBConn);

        try
        {
            DBConn.Open();
            DBCmd.Parameters.Add("@TrainingID", SqlDbType.VarChar).Value = GridView1.SelectedRow.FindControl("TrainingID");   //GridView1.TrainingID Selected Row column Index 1;  ?    //EmployeeName.Text;

            SqlDataReader dr = DBCmd.ExecuteReader();
            if (dr.HasRows)
            {
                while (dr.Read())
                {
                    var tHours = dr["Hours"].ToString();
                    TextBox t = (TextBox)e.Row.FindControl("TbHoursCompleted");
                    t.Text = tHours.ToString();
                }

                dr.Close();
            }
            else
            {
                //msgFetch.Text = "No records found.";
            }
        }
        catch (Exception ex)
        {
            Response.Write(ex.Message);
        }
        DBCmd.Dispose();
        DBConn.Close();
    }
kgsdhlau

kgsdhlau1#

好吧,这是如何工作的:
我们提供,将GV与数据绑定。
在行数据绑定时,我们“可以”拉取其他数据,但是我们想要或需要这样做吗?
让我们举个简单的例子。有些人,他们有一个酒店的身份证。
所以,这个标记:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
    DataKeyNames="ID" CssClass="table table-hover" Width="40%">
    <Columns>
        <asp:BoundField DataField="Firstname" HeaderText="Firstname" />
        <asp:BoundField DataField="LastName" HeaderText="LastName" />
        <asp:BoundField DataField="City" HeaderText="From City" />
        <asp:BoundField DataField="Hotel_ID" HeaderText="Hotel" />
    </Columns>
</asp:GridView>

我们的准则是:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
        LoadGrid();
}

void LoadGrid()
{
    using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.TEST4))
    {
        string strSQL = @"SELECT * FROM People";

        using (SqlCommand cmdSQL = new SqlCommand(strSQL, conn))
        {
            conn.Open();
            DataTable rstData = new DataTable();
            rstData.Load(cmdSQL.ExecuteReader());
            GridView1.DataSource = rstData;
            GridView1.DataBind();
        }
    }
}

现在我们有了这个

现在,我们当然需要table Hotels中的酒店名称。
我们也许可以为数据行绑定事件中的每一行执行一个全新的查询,但这实际上是把SQL服务器打得半死,因为对于每一行,我们都必须执行一个全新的查询。
因此,在99%的情况下,我们应该使用SQL拉入额外的列。
所需的sql很简单,而且相当容易。
我们会离开的(因为有些人还在表演,但可能没有设置酒店ID)。
因此,我们将在标记中添加HotelName,如下所示:

<asp:BoundField DataField="HotelName" HeaderText="Hotel" />

所以,现在SQL变成了:

string strSQL =
   @"SELECT *, HotelName FROM People
   LEFT JOIN HotelsA on HotelsA.ID = People.Hotel_ID";

现在网格显示如下:

(we当然可以/将/应该从上面移除hotel_id列)。
那么,在大多数情况下,从另一个表中提取相关的值,我们使用“join”来获取/查找/使用另一个表中的任何附加列。
如果我们要使用行数据绑定事件,那么对于25行,我们必须执行25个单独的SQL查询--除非我们用尽了所有其他简单的方法,否则我们真的不想这样做,而且在大多数情况下,这种简单的方法也会有最好的性能,甚至更好的是,最终需要我们编写更少的代码。
现在,假设我们在GV中有一个RB(单选按钮列表),并且我们只在Rb设置为“是”时显示其他值。
好的,那么我们的标记就变成了:

<asp:TemplateField HeaderText="Status">
                     <ItemTemplate>
                        <asp:RadioButtonList ID="RbCompleted" runat="server" 
                            Text='<%# Eval("ShowHotel") %>' >
                            <asp:ListItem>Yes</asp:ListItem>
                            <asp:ListItem>No</asp:ListItem>
                            <asp:ListItem>Pending</asp:ListItem>
                        </asp:RadioButtonList>
                     </ItemTemplate>
                 </asp:TemplateField>
                <asp:TemplateField HeaderText="Hotel Name">
                    <ItemTemplate>
                        <asp:Label ID="txtHotel" runat="server"
                            Text="" >
                        </asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>

现在,行数据绑定事件如下所示:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            DataRowView gData = (DataRowView)e.Row.DataItem;
            Debug.Print(gData["ShowHotel"].ToString());
            if (gData["ShowHotel"].ToString() == "Yes")
            {
                Label lblHotel = (Label)e.Row.FindControl("txtHotel");
                lblHotel.Text = gData["HotelName"].ToString();
            }
        }
    }

注非常接近上面的。2我正在使用和操作的数据行值不是网格行,而是“数据行视图”。3这给了我用于绑定的整行数据,因此即使表中没有显示在GV中的值仍然可用。4数据行视图在绑定完成后超出范围,但在绑定过程中,我们可以充分使用数据源。
因此,我们再次强调,我们实际上不需要对每一行执行查询,并且仍然可以使用提供GV的SQL来执行“连接”Hours on/by training ID的条件。
如前所述,您可以为GV数据绑定的每一行创建/execute/have/build/code out sql和查询,但如上所述,您最好在基本查询中加入该值-即使您不打算对所有行使用/display。注意我们如何从第二个表中加入多个列,并再次注意这些列不必放置在GV中。但是可以从数据行视图源中使用。(因此,对于税收计算,或者甚至基于其他状态列的颜色格式化,我们可以使用/查看该列,即使不在GV控件中,但存在于数据源中。
因此,上面的结果现在是这样的:

我有一个名为“ShowHotel”的测试列来驱动RB按钮,但正如前面提到的,这个概念应该100%适用于您的示例。

编辑:更改单选按钮选择时更改gv

好了,再一次,加入数据列变得非常方便。
因此单选按钮列表标记变成这样-自动回发

<ItemTemplate>
    <asp:RadioButtonList ID="RbCompleted" runat="server" 
        Text='<%# Eval("ShowHotel") %>' 
        AutoPostBack="true" OnSelectedIndexChanged="RbCompleted_SelectedIndexChanged"
        MyHotelName = '<%# Eval("HotelName") %>' >
        <asp:ListItem>Yes</asp:ListItem>
        <asp:ListItem>No</asp:ListItem>
        <asp:ListItem>Pending</asp:ListItem>
    </asp:RadioButtonList>
</ItemTemplate>

后面的代码变成这样:

protected void RbCompleted_SelectedIndexChanged(object sender, EventArgs e)
    {
        RadioButtonList RB = (RadioButtonList)sender;
        GridViewRow gRow = (GridViewRow)RB.NamingContainer;

        Label txtHotel = (Label)gRow.FindControl("txtHotel");
        if (RB.SelectedItem.Text == "Yes")
            txtHotel.Text = RB.Attributes["MyHotelName"];
        else
            txtHotel.Text = "";            
    }

所以,现在我们得到/看到这个:

相关问题