![](/img/trans.png)
[英]Why LinkButton inside GridView which is present in Updatepanel not firing OnClientClick event?
[英]Hide a LinkButton inside an UpdatePanel, which is inside a GridView
是否可以在GridView的UpdatePanel中隱藏LinkButton? 還是我要以一種完全錯誤的方式來解決這個問題?
當數據庫中ExpenseReceipt
為null時,我想禁用lnkDownload
按鈕,並顯示文本“ No Receipt”。
當我調試時, lnkDownload
返回為空。
ASP.NET:
<asp:GridView ID="gvTillExpenseRegistration" runat="server" AutoGenerateColumns="False"
EmptyDataText="No expense registered today." GridLines="Horizontal" SkinID="SimpleBlackWhite"
CellPadding="10" Caption="Today's Expense Registration" OnRowCommand="gvTillExpenseRegistration_RowCommand" DataKeyNames="ExpenseID, FileName">
<Columns>
<asp:BoundField DataField="ExpenseID" HeaderText="ExpenseID" Visible="False"/>
<asp:BoundField DataField="Description" HeaderText="Type" />
<asp:BoundField DataField="TotalAmount" HeaderText="Amount" SortExpression="TotalAmount"
DataFormatString="{0:0.00}">
<ItemStyle HorizontalAlign="Right" />
</asp:BoundField>
<asp:BoundField DataField="RegisterDate" HeaderText="Time" DataFormatString="{0:hh:mm tt}">
</asp:BoundField>
<asp:BoundField DataField="RegisteredBy" HeaderText="User"></asp:BoundField>
<asp:BoundField DataField="FileName" HeaderText="FileName" Visible="False"/>
<asp:TemplateField>
<ItemTemplate>
<asp:UpdatePanel ID="updDownload" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:LinkButton ID="lnkDownload" runat="server" CausesValidation="False" CommandName="Download" Text='Download' />
</ContentTemplate>
<Triggers>
<asp:PostBackTrigger ControlID="lnkDownload" />
</Triggers>
</asp:UpdatePanel>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
C#:
private void LoadTodaysExpensesByTill(int tillID)
{
DataTable dt = new DataTable();
dt = new TillEndOfDayDAL().GetTodaysExpensesByTillID(tillID);
pnlTillExpenseRegistration.Visible = false;
if (dt != null && dt.Rows.Count > 0)
{
gvTillExpenseRegistration.DataSource = dt;
foreach (DataRow row in dt.Rows)
{
if (row["ExpenseReceipt"] == DBNull.Value)
{
LinkButton lnkDownload = (LinkButton)gvTillExpenseRegistration.FindControl("lnkDownload");
lnkDownload.Enabled = false;
lnkDownload.Text = "No Receipt";
}
}
pnlTillExpenseRegistration.Visible = true;
}
gvTillExpenseRegistration.DataBind();
}
您可以使用三元運算符內聯設置LinkButton的Text和Enabled屬性。
<asp:LinkButton ID="lnkDownload" runat="server"
Text='<%# string.IsNullOrEmpty(Eval("ExpenseReceipt").ToString()) ? "No Receipt" : "Download" %>'
Enabled='<%# string.IsNullOrEmpty(Eval("ExpenseReceipt").ToString()) ? false : true %>' />
並且最好將GridView包裝在UpdatePanel中,而不是在ItemTemplates中包裝UpdatePanel。 這可能會導致意外的行為。
但是,根據您的情況,由於要添加UpdatePanel,然后將其設置為PostBackTrigger,因此可以將其完全刪除,從而使面板無用。
嘗試在gvTillExpenseRegistration上添加事件
<asp:GridView ID="gvTillExpenseRegistration" runat="server"
OnRowDataBound="gvTillExpenseRegistration_DataBound"
..
protected void gvTillExpenseRegistration_DataBound(object sender, EventArgs e)
{
}
您需要根據以下內容更改代碼
ASPX
<asp:GridView ID="gvTillExpenseRegistration" runat="server" AutoGenerateColumns="False"
EmptyDataText="No expense registered today." GridLines="Horizontal" SkinID="SimpleBlackWhite"
CellPadding="10" Caption="Today's Expense Registration" OnRowCommand="gvTillExpenseRegistration_RowCommand" OnRowDataBound="GrdView_RowDataBound" DataKeyNames="ExpenseID, FileName">
<Columns>
<asp:BoundField DataField="ExpenseID" HeaderText="ExpenseID" Visible="False" />
<asp:BoundField DataField="Description" HeaderText="Type" />
<asp:BoundField DataField="TotalAmount" HeaderText="Amount" SortExpression="TotalAmount"
DataFormatString="{0:0.00}">
<ItemStyle HorizontalAlign="Right" />
</asp:BoundField>
<asp:BoundField DataField="RegisterDate" HeaderText="Time" DataFormatString="{0:hh:mm tt}"></asp:BoundField>
<asp:BoundField DataField="RegisteredBy" HeaderText="User"></asp:BoundField>
<asp:BoundField DataField="FileName" HeaderText="FileName" Visible="False" />
<asp:TemplateField>
<ItemTemplate>
<asp:HiddenField runat="server" ID="hdnExpenseReceipt" Value='<%# Eval("ExpenseReceipt") %>' />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField>
<ItemTemplate>
<asp:UpdatePanel ID="updDownload" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:LinkButton ID="lnkDownload" runat="server" CausesValidation="False" CommandName="Download" Text='Download' />
</ContentTemplate>
<Triggers>
<asp:PostBackTrigger ControlID="lnkDownload" />
</Triggers>
</asp:UpdatePanel>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
C#
private void LoadTodaysExpensesByTill(int tillID)
{
DataTable dt = new DataTable();
dt = new TillEndOfDayDAL().GetTodaysExpensesByTillID(tillID);
pnlTillExpenseRegistration.Visible = false;
if (dt != null && dt.Rows.Count > 0)
{
gvTillExpenseRegistration.DataSource = dt;
pnlTillExpenseRegistration.Visible = true;
}
gvTillExpenseRegistration.DataBind();
}
還創造了一種方法
protected void GrdView_RowDataBound(object sender, GridViewRowEventArgs e)
{
HiddenField hdnExpenseReceipt = (HiddenField)e.Row.FindControl("hdnExpenseReceipt");
if (string.IsNullOrWhiteSpace(hdnExpenseReceipt.Value))
{
LinkButton lnkDownload = (LinkButton)gvTillExpenseRegistration.FindControl("lnkDownload");
lnkDownload.Visible = false;
}
}
在gridview中創建行時,將每次調用此方法。
嘗試讓我知道。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.