我正在为我工作的员工申请索赔费用。该过程的一部分包含列表视图,新要求的一部分是,如果费用类型是里程,用户将无法编辑该项目,则仅删除并重新提交作为业务规则和英国税务原因的一部分等。
无论如何,我希望能够在列表视图的每个项目中找到具有特定文本值的控件。
我认为如下所示,但这不正确,我知道为什么。
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并禁用该费用项目的编辑功能。仅供参考,你想知道周末是费用,孩子是个人消费项目。
你们其中一个可爱的人能否告诉我最好的方法来实现这个目标?
由于
马特
答案 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
}
}
}