繁体   English   中英

在GridView内部的UpdatePanel中隐藏一个LinkBut​​ton

[英]Hide a LinkButton inside an UpdatePanel, which is inside a GridView

是否可以在GridView的UpdatePanel中隐藏LinkBut​​ton? 还是我要以一种完全错误的方式来解决这个问题?

当数据库中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();
}

您可以使用三元运算符内联设置LinkBut​​ton的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM