[英]Dynamic LinkButton on GridView PagerTemplate not firing event
[英]Gridview Dynamic linkButton event not fired
我正在創建帶有動態控件(包括itemtemplates)的GridView。 這是html代碼。
<asp:GridView ID="gvItems" runat="server"
AutoGenerateColumns="False" CellPadding="4"
GridLines="None"
Width="95%" EmptyDataText="Records Not Found!!!!"
onselectedindexchanged="gvItems_SelectedIndexChanged"
onrowdatabound="gvItems_RowDataBound" onrowcommand="gvItems_RowCommand"
onselectedindexchanging="gvItems_SelectedIndexChanging">
<RowStyle CssClass="GVRowStyle" />
<Columns>
</Columns>
<PagerStyle CssClass="gridPager" />
<SelectedRowStyle BackColor="#DCCDDA" Font-Bold="true" ForeColor="#510030" />
<HeaderStyle CssClass="Gheader" />
<AlternatingRowStyle CssClass="AlternatingRowStyle" />
<EditRowStyle BackColor="#7C6F57" />
<EmptyDataRowStyle CssClass="EmptyRowStyle" />
</asp:GridView>
這是添加ItemTemplate的類。
public class GridViewTemplate : ITemplate
{
ListItemType _templateType;
string _columnName;
public GridViewTemplate(ListItemType type, string colname)
{
_templateType = type;
_columnName = colname;
}
void ITemplate.InstantiateIn(System.Web.UI.Control container)
{
switch (_templateType)
{
case ListItemType.Header:
Label lbl = new Label();
lbl.Text = _columnName;
container.Controls.Add(lbl);
break;
case ListItemType.Item:
LinkButton Lb1 = new LinkButton();
Lb1.CommandName = "Select";
Lb1.DataBinding += new EventHandler(tb1_DataBinding);
container.Controls.Add(Lb1);
break;
case ListItemType.EditItem:
break;
case ListItemType.Footer:
CheckBox chkColumn = new CheckBox();
chkColumn.ID = "Chk" + _columnName;
container.Controls.Add(chkColumn);
break;
}
}
void tb1_DataBinding(object sender, EventArgs e)
{
LinkButton LinkData = (LinkButton)sender;
GridViewRow container = (GridViewRow)LinkData.NamingContainer;
object dataValue = DataBinder.Eval(container.DataItem, _columnName);
if (dataValue != DBNull.Value)
{
LinkData.Text = dataValue.ToString();
LinkData.ForeColor = System.Drawing.Color.Red;
LinkData.CommandName = "Select";
}
}
}
這是頁面代碼........................................
for (int i = 0; i < dtGrid.Columns.Count; i++)
{
string columnName = dtGrid.Columns[i].ColumnName;
BoundField bField = new BoundField();
TemplateField tField = new TemplateField();
if (i == 0)
{
tField.HeaderTemplate = new GridViewTemplate(ListItemType.Header, columnName);
tField.ItemTemplate = new GridViewTemplate(ListItemType.Item, columnName);
tField.HeaderStyle.HorizontalAlign = HorizontalAlign.Left;
tField.ItemStyle.ForeColor = System.Drawing.Color.Red;
gvItems.Columns.Add(tField);
}
else
{
bField.DataField = columnName;
bField.HeaderText = columnName;
bField.HeaderStyle.HorizontalAlign = HorizontalAlign.Left;
gvItems.Columns.Add(bField);
}
現在的問題是,當我單擊鏈接按鈕時,它消失了,除了rowdatabound之外沒有其他事件發生。
由於要動態創建這些列,因此需要在每次回發時重新創建控件。 對於未觸發的事件處理程序,請確保在頁面生命周期中足夠早地創建列。 我建議創建動態列OnInit
,看看是否能解決問題。
您要重新綁定回發數據嗎?
請確保您的數據綁定邏輯被if(!IsPostback)包圍。
重新綁定網格意味着重新創建按鈕,因此不會觸發任何事件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.