gpt4 book ai didi

c# - 模板字段消失

转载 作者:太空狗 更新时间:2023-10-29 23:36:13 24 4
gpt4 key购买 nike

我有一个 gridview,用于根据下拉列表中的选定值显示记录。

在 gridview 中,在代码后面添加了动态数量的绑定(bind)字段列,然后是模板字段中的下拉列表和第二个模板字段中的按钮。

问题是,当我点击按钮时,模板字段消失了。

GridView

<asp:UpdatePanel ID="upnlDetail" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:GridView ID="gvDetails" runat="server"
AutoGenerateColumns="false"
SkinID="gridviewGray"
CellPadding="3"
OnRowCommand="gvDetails_RowCommand"
OnRowDataBound="gvDetails_RowDataBound"
AllowSorting="true">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:DropDownList ID="ddlStatus" runat="server"
AutoPostBack="true"
OnSelectedIndexChanged="ddlStatus_SelectedIndexChanged">
</asp:DropDownList>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField>
<ItemTemplate>
<asp:Button ID="btnSave" runat="server"
CommandName="Save"
CommandArgument="<%# ((GridViewRow) Container).RowIndex %>"
Text="Save" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</ContentTemplate>
</asp:UpdatePanel>

代码隐藏

while (gvDetails.Columns.Count > 2)  //Don't remove the rightmost columns
{
gvDetails.Columns.RemoveAt(0);
}

gvDetails.Columns.Insert(0, GridViewTools.CreateBoundField(
"Request.Amount", "Amount", "Money", 50));
gvDetails.Columns.Insert(0, GridViewTools.CreateBoundField(
"Request.CustomerName", "Customer", "comment", 200));
gvDetails.Columns.Insert(0, GridViewTools.CreateBoundField(
"Request.BillAccountFormatted", "Account", "text", 100));
gvDetails.Columns.Insert(0, GridViewTools.CreateBoundField(
"Request.Id", "Request", "int", 50));

gvDetails.DataSource = dt;
gvDetails.DataBind();

方法 GridViewTools.CreateBoundField 是一种自定义方法,它设置我的默认绑定(bind)字段属性并返回 BoundField 对象。

public static BoundField CreateBoundField(...){...}

在对其进行测试时,gridview 会在初始加载时按需填充。但是,RowCommand 事件不会触发,并且在单击按钮时两个模板字段都会消失。下一个 gridview.RowDataBound 事件会抛出一个空对象错误,因为在该行中不再找到下拉列表。

如果我删除添加绑定(bind)字段 [Columns.Insert] 的行,则当单击 btnSave 时 RowCommand 按预期触发并且模板字段持续存在。如果我再次添加一个绑定(bind)字段列,RowCommand 不会触发并且模板字段会消失。

有什么建议吗?为什么向 gridview 添加新列会使预先存在的按钮的 RowCommand 事件无效并使模板字段消失?

更新我已经从 GridView 声明中删除了模板字段并将控件添加到绑定(bind)字段,但仍然得到相同的结果。初始加载时显示,但单击后消失。

我还查看了 Page_Unload 事件中的 GridView ,它仍然包含此时的列,即使它们没有显示在屏幕上。在 Page_Unload 之后我可以捕获任何事件吗?

最佳答案

在代码隐藏中构建所有内容。这不是偏好问题。请阅读Dynamic Web Server Controls and View State

网络表单:

<asp:GridView ID="gvDetails" runat="server"
AutoGenerateColumns="false"
SkinID="gridviewGray"
CellPadding="3"
OnRowDataBound="OnRowDataBound"
OnRowCommand="gvDetails_RowCommand"
AllowSorting="true">
</asp:GridView>

代码隐藏:

public class GridViewDropDownListTemplate : ITemplate
{
public void InstantiateIn(Control container)
{
DropDownList ddlStatus = new DropDownList();
ddlStatus.ID = "ddlStatus";
ddlStatus.Items.Add(new ListItem("Status 1"));
ddlStatus.Items.Add(new ListItem("Status 2"));
ddlStatus.Items.Add(new ListItem("Status 3"));
ddlStatus.Items.Add(new ListItem("Status 4"));
ddlStatus.AutoPostBack = true;
ddlStatus.SelectedIndexChanged += ddlStatus_SelectedIndexChanged;
container.Controls.Add(ddlStatus);
}

public void ddlStatus_SelectedIndexChanged(object sender, EventArgs e)
{
}
}

public class GridViewButtonTemplate : ITemplate
{
public void InstantiateIn(Control container)
{
Button btnSave = new Button();
btnSave.ID = "btnSave";
btnSave.Text = "Save";
container.Controls.Add(btnSave);
}
}

public partial class Default : System.Web.UI.Page
{
object[] data = new[]
{
new { Amount = 12500.00, Account = "1234-567-89" },
new { Amount = 87000.00, Account = "0000-999-88" }
};

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

BuildTemplateFields();
BindData();
}

protected void BuildBoundFields()
{
// Amount bound field
BoundField boundFieldAmount = new BoundField();
boundFieldAmount.DataField = "Amount";
boundFieldAmount.HeaderText = "Amount";
boundFieldAmount.SortExpression = "Amount";
boundFieldAmount.ItemStyle.Width = Unit.Pixel(100);
gvDetails.Columns.Add(boundFieldAmount);

// Account bould field
BoundField boundFieldAccount = new BoundField();
boundFieldAccount.DataField = "Account";
boundFieldAccount.HeaderText = "Account";
boundFieldAccount.SortExpression = "Account";
boundFieldAccount.ItemStyle.Width = Unit.Pixel(250);
gvDetails.Columns.Add(boundFieldAccount);

// ...
}

protected void BuildTemplateFields()
{
// Status template field
TemplateField statusTemplateField = new TemplateField();
statusTemplateField.ItemTemplate = new GridViewDropDownListTemplate();
gvDetails.Columns.Add(statusTemplateField);

// Save template field
TemplateField saveTemplateField = new TemplateField();
saveTemplateField.ItemTemplate = new GridViewButtonTemplate();
gvDetails.Columns.Add(saveTemplateField);
}

protected void BindData()
{
gvDetails.DataSource = data;
gvDetails.DataBind();
}

protected void OnRowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
Button btnSave = (Button)e.Row.FindControl("btnSave");
if (btnSave != null)
{
btnSave.CommandArgument = e.Row.RowIndex.ToString();
}
}
}

protected void gvDetails_RowCommand(object sender, GridViewCommandEventArgs e)
{
}
}

关于c# - 模板字段消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49740767/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com