如何为ASP.NET GridView手动添加行设置ActionLabel文本为New
问题:如何将GridView手动添加行的ActionLabel文本设置为「New」?
现有GridView控件代码
<asp:GridView ID="contacts" runat="server" AutoGenerateColumns="false" Width="100%"> <Columns> <asp:TemplateField Visible="false"> <ItemTemplate> <asp:HiddenField ID="ContactID" runat="server" Value='<%# Bind("employerdetailcontactid") %>' /> </ItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText ="Action" ItemStyle-CssClass="center" > <ItemTemplate> <asp:Label ID="ActionLabel" runat="server" Text='<%# Bind("action") %>' /> <asp:CheckBox ID="Action" runat="server" /> </ItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText ="First Name"> <ItemTemplate> <asp:TextBox ID="FirstName" runat="server" Text='<%# Bind("firstname") %>' /> </ItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText ="Last Name"> <ItemTemplate> <asp:TextBox ID="LastName" runat="server" Text='<%# Bind("lastname") %>' /> </ItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText ="E-Mail"> <ItemTemplate> <asp:TextBox ID="Email" runat="server" Text='<%# Bind("email") %>' /> </ItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText ="Phone Number"> <ItemTemplate> <asp:TextBox ID="PhoneNumber" runat="server" Text='<%# Bind("phonenumber") %>' /> </ItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText ="Send E-mail" ItemStyle-CssClass="center" > <ItemTemplate> <asp:CheckBox ID="SendEmail" runat="server" Checked='<%# Convert.ToBoolean( Eval("sendemail")) %>' /> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView>
现有填充GridView的代码
SqlCommand cmd = new SqlCommand("SELECT *,'Delete' as action FROM contact WHERE employerid=@employerid", conn); cmd.Parameters.AddWithValue("@employerid", id); SqlDataReader dr = cmd.ExecuteReader(); DataTable dt = new DataTable(); // 手动添加列以支持后续新增行 dt.Columns.Add("ContactID"); dt.Columns.Add("Action"); dt.Columns.Add("FirstName"); dt.Columns.Add("LastName"); dt.Columns.Add("Email"); dt.Columns.Add("PhoneNumber"); dt.Columns.Add("SendEmail"); dt.Load(dr); DataRow drow = dt.NewRow(); drow["ContactID"] = 0; drow["Action"] = false; drow["FirstName"] = ""; drow["LastName"] = ""; drow["Email"] = ""; drow["PhoneNumber"] = ""; drow["SendEmail"] = "False"; dt.Rows.Add(drow); contacts.DataSource = dt; contacts.DataBind();
需求说明:该GridView包含数据库返回的若干行,外加一行手动添加的新记录,希望数据库返回行的ActionLabel显示「Delete」,手动添加行显示「New」。
解决方案
方法一:直接在添加新行时设置「action」字段值
你当前的SQL语句已经给数据库返回的行设置了action='Delete',但手动添加新行时错误地给Action字段赋值了布尔值false。需要修改添加新行的代码,给对应字段赋值「New」:
修改填充代码中添加新行的部分:
DataRow drow = dt.NewRow(); drow["ContactID"] = 0; drow["action"] = "New"; // 改为设置action字段为"New",注意字段名要和SQL中一致(区分大小写) drow["FirstName"] = ""; drow["LastName"] = ""; drow["Email"] = ""; drow["PhoneNumber"] = ""; drow["SendEmail"] = "False"; dt.Rows.Add(drow);
注意:你的DataTable中添加的列是Action,但SQL返回的是action(小写),GridView绑定的也是action,所以字段名要保持一致,避免因大小写导致绑定失效。
方法二:利用GridView的RowDataBound事件动态设置
如果不想修改DataTable的赋值逻辑,可以在GridView的RowDataBound事件中,判断当前行是否是手动添加的行(通过ContactID是否为0),然后设置ActionLabel的文本:
- 在GridView控件中添加
OnRowDataBound="contacts_RowDataBound"属性:
<asp:GridView ID="contacts" runat="server" AutoGenerateColumns="false" Width="100%" OnRowDataBound="contacts_RowDataBound">
- 在后台代码中添加事件处理方法:
protected void contacts_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { // 获取当前行的ContactID值 HiddenField contactIdField = e.Row.FindControl("ContactID") as HiddenField; if (contactIdField != null && contactIdField.Value == "0") { // 找到ActionLabel并设置文本为"New" Label actionLabel = e.Row.FindControl("ActionLabel") as Label; if (actionLabel != null) { actionLabel.Text = "New"; } } } }
两种方法都可以实现需求,方法一更直接,方法二更灵活,适合需要动态判断的场景。
内容的提问来源于stack exchange,提问作者RickInWestPalmBeach
相关产品推荐
相关产品推荐

