我的列表视图赢得';t输出,如果post-back是必需的

本文关键字:post-back 如果 输出 视图 列表 我的 | 更新日期: 2023-09-27 18:22:20

所以我在中运行一个C#函数,该函数应该根据值更改文本的颜色。当我从列表视图中删除函数时,它会输出值,但当我包含它时,它不会输出任何值。我现在终于发现,我的函数没有什么问题,只是我如何将数据绑定到列表视图,所以我想知道我做错了什么。

这是我的代码:

 <asp:SqlDataSource id="SqlDataSource3" runat="server" ConnectionString="<%$ ConnectionStrings:2007  SoundAssist VER 1.0.5  05-12-2011 (2013-06-24)ConnectionString %>" ProviderName="<%$ ConnectionStrings:2007 SoundAssist VER 1.0.5  05-12-2011  2013-06-24)ConnectionString.ProviderName %>" SelectCommand="SELECT [Plant], [Group No#] AS column1, [Group], [Job Code] AS Job_Code, [TWA], [Job Classification] AS Job_Classification, [Job Function] AS Job_Function, [Job Description] AS Job_Description FROM [Temp Table that contains TWA values] WHERE (([Job Description] = ?) AND ([Group] = ?) AND ([Job Classification] = ?))">
                                                    <SelectParameters>
                                                        <asp:ControlParameter ControlID="DropDownList6" Name="Job_Description" PropertyName="SelectedValue" Type="String" />
                                                        <asp:ControlParameter ControlID="DropDownList4" Name="Group" PropertyName="SelectedValue" Type="String" />
                                                        <asp:ControlParameter ControlID="DropDownList5" Name="Job_Classification" PropertyName="SelectedValue" Type="String" />
                                                    </SelectParameters>

和我的列表视图行:

<asp:ListView id="YourListView"  runat="server" DataSourceID="SqlDataSource3" OnItemDataBound="YourListView_ItemDataBound" >

我的颜色功能:

protected void YourListView_ItemDataBound(object sender, ListViewItemEventArgs e)
  {
if (e.Item.ItemType == ListViewItemType.DataItem)
{
    Label theTWALabel = (Label)e.Item.FindControl("TWALabel");
    int theTWAValue = Convert.ToInt32(theTWALabel.Text);
    if (theTWAValue >= 85)
    {
        if (theTWAValue < 90)
        {
            theTWALabel.CssClass = "YellowThis";
        }
        else
        {
            theTWALabel.CssClass = "RedThis";
        }
    }
}
}

这是列表视图:

<ItemTemplate>
    <span style="background-color: white;color: #333333; border: 2em; border-width:1em; border-color:black;"> 
        Plant Name: 
        <asp:Label id="PlantLabel" runat="server" Text='<%# Eval("Plant") %>' />
        <br />
        Department #:
        <asp:Label id="column1Label" runat="server" Text='<%# Eval("column1") %>' />
        <br />
        Department Name:
        <asp:Label id="GroupLabel" runat="server" Text='<%# Eval("Group") %>' />
        <br />
        Job Code:
        <asp:Label id="Job_CodeLabel" runat="server" Text='<%# Eval("Job_Code") %>' />
        <br /> 
        TWA
        <asp:Label id="TWALabel" runat="server" Text='<%# Eval("TWA") %>' />
        <br />
    </span>
</ItemTemplate> 

此外,我没有在其中键入这些(我指的是Sql语句),我使用了内置的asp.net连接向导来完成这项工作,它为我创建了所有这些。

编辑:如果你需要任何其他信息来帮助回答这个问题,请评论

编辑2:我可能需要一个if post-back函数吗?

我的列表视图赢得';t输出,如果post-back是必需的

问题是您正试图访问YourListView_ItemDataBound事件处理程序中的控件,而此时ListView尚未加载。

尝试将事件处理程序onLoad添加到您的ListView中,然后在该方法中使用以下项目:

protected void YourListView_Load(object sender, EventArgs e)
{
    Label theTWALabel;
    int theTWAValue;
    foreach (ListViewItem item in YourListView.Items)
    {
        theTWALabel = (Label)item.FindControl("TWALabel");
        theTWAValue = Convert.ToInt32(theTWALabel.Text);
        if (theTWAValue >= 85)
        {
            if (theTWAValue < 90)
                theTWALabel.ForeColor = System.Drawing.Color.Yellow;
            else
                theTWALabel.ForeColor = System.Drawing.Color.Red;
        }
    }
}

您可以尝试在控件中循环,而不是使用FindControl。

if (e.Item.ItemType == ListViewItemType.DataItem)
{
    foreach (Control c in e.Item.Controls) 
    {
        if (c is Label && c.ID.Contains("TWALabel"))
        {
            Label theTWALabel = (Label)c
            int theTWAValue = Convert.ToInt32(theTWALabel.Text);
            if (theTWAValue >= 85)
            {
                if (theTWAValue < 90)
                {
                    theTWALabel.CssClass = "YellowThis";
                }
                else
                {
                    theTWALabel.CssClass = "RedThis";
                }
            }            
        }
    }
}

即使.Net修改了ID名称,您也可以检查ID是否包含子字符串TWALabel,并找到您的控件。

也许有更好的方法,但我想不出其他可行的方法。

YourListView_ItemDataBound方法在列表视图进行数据绑定时被调用。此时asp.net正在为数据源中的每一行在网格中创建一行,因此您将无法像现在这样通过从控件中提取已发布的数据来访问这些数据。为时已晚,因为旧版本的网格已经被丢弃了。

我想你可以选择

  • 将TWALabel自动发布回服务器并创建OnChange事件
  • 分析Request.Params以查找每行的已过帐回值
  • 在数据绑定发生之前,尝试在页面生命周期的早期提取您需要的内容。我认为您在Page_Load期间仍然可以访问此数据