在相同类型的listview项模板中查找控件

时间:2011-07-29 08:33:14

标签: c# .net asp.net listview

我正在为我工​​作的员工申请索赔费用。该过程的一部分包含列表视图,新要求的一部分是,如果费用类型是里程,用户将无法编辑该项目,则仅删除并重新提交作为业务规则和英国税务原因的一部分等。

无论如何,我希望能够在列表视图的每个项目中找到具有特定文本值的控件。

我认为如下所示,但这不正确,我知道为什么。

        Label ExpenseTypeLabel = (Label)Expenses.FindControl("ExpenseTypeLabel");
        string ExpenseType = (ExpenseTypeLabel.Text.ToString());

        if (ExpenseType == "Mileage")
        {
            foreach (ListViewDataItem thisItem in Expenses.Items)
            {

                ImageButton btnEdit = (ImageButton)thisItem.FindControl("btnEdit");
                btnEdit.Enabled = false;


            }
        }

费用基于周末,并且当页面加载时,它会抛出我的例外情况,因为它无法绑定到特定的单个控件,因为有许多ExpenseTypeLabels与当前周末(首先加载)的费用相关联。

我在这里要完成的是在项目模板和交替项目模板中找到所有ExpenseTypeLabel并禁用该费用项目的编辑功能。仅供参考,你想知道周末是费用,孩子是个人消费项目。

你们其中一个可爱的人能否告诉我最好的方法来实现这个目标?

由于

马特

2 个答案:

答案 0 :(得分:2)

绑定顺序和访问绑定项的时间非常重要;当您拥有包含绑定项的子控件时尤其如此。

如果您想影响这些绑定控件的显示,通常可以从aspx端执行此操作。

创建从前端到服务器端功能的链接,然后传递所有必要的参数:

<asp:listview id='lstExpense'>
   ...
   <asp:button id='btnEdit' enabled='<%#= isEnabled(((Expense)Container.DataItem).ExpenseType) %>' ...
   ...
<asp:listview>

在服务器端,创建一个公共函数以返回该值:

public boolean IsEnabled(string ExpenseType) {
    return ('Mileage' != ExpenseType);
}

最好的解决方案是使用jQuery。不夸张,但你可以通过以下简单的事情完成所有这些:

$('.rowClass').each(function() {
    if ($(this).find('.expenseTypeClass').val() == 'Mileage')) 
        $(this).find('.btnEditClass').attr('disabled','disabled');
})

答案 1 :(得分:1)

使用OnItemDataBound事件如下

OnItemDataBound="Expenses_ItemDataBound"

protected void Expenses_ItemDataBound(object sender, ListViewItemEventArgs e)
{

    if (e.Item.ItemType == ListViewItemType.DataItem)
    {

        Label ExpenseTypeLabel = (Label)e.Item.FindControl("ExpenseTypeLabel");

        string ExpenseType = (ExpenseTypeLabel.Text.ToString());

        if (ExpenseType == "Mileage")
        {
            // disable button
        }
    }
}