0

嘿伙计们,我制作了一个中继器,显示员工 ID 和他在特定月份的休假。现在我的中继器工作正常。只是我想将用户在文本框中输入的 empID 显示为转发器标题。我的中继器代码是

> <table class="table1" >
>     <asp:Repeater ID="Repeater1" runat="server">
>        <HeaderTemplate>
>            <tr>
>                 <td>EmpID</td>
>        </HeaderTemplate>
>        <ItemTemplate>
>         <td><asp:Label ID="lblmonths" runat="server" Text='<%# Eval("Monthnames") %>' ></asp:Label></td>
>        </ItemTemplate>
>        <FooterTemplate>
>             </tr>
>        </FooterTemplate>
         </asp:Repeater>
>                 <asp:Repeater ID="Repeater2"  runat="server" >
>                 <HeaderTemplate>
>                 <tr>
>                         <td><asp:Label ID="empID" runat="server" Text='<%# Eval("EmpID") %>' ></asp:Label></td>
>                 </HeaderTemplate>
>                     <ItemTemplate>
>                         <td><asp:Label ID="leave" runat="server" Text='<%# Eval("Leaves") %>' ></asp:Label></td>
>                     </ItemTemplate>
>                      <FooterTemplate>
>                  </tr>        
>                      </FooterTemplate>  
>                 </asp:Repeater>
>                 
>             
>     </table>

而我背后的代码是

string cmdText3 = "select count(*) as Leaves from attendance where empid = '" + empID.Value + "' and extract(month from LeaveDate) between 1 and 6 group by extract(month from LeaveDate)";
                MySqlCommand cmd3 = new MySqlCommand(cmdText3, cnx);
                MySqlDataAdapter adapter3 = new MySqlDataAdapter();
                DataSet ds3 = new DataSet();
                adapter3.SelectCommand = cmd3;
                adapter3.Fill(ds3);
                DataTable dt3 = ds3.Tables[0];
                Repeater2.DataSource = dt3;
                Repeater2.DataBind();

这里显示 6 个月。现在此代码工作正常,但 EmpID 未显示。你能告诉我如何在这个标签的文本框中显示 empID 吗(<asp:Label ID="empID" runat="server" Text='<%# Eval("EmpID") %>' ></asp:Label>)?我不熟悉后面代码中显示的数据表。可能在那里添加一列会有所帮助。我试过但什么也没发生。你能帮我解决这个问题吗?

4

2 回答 2

1

尽量不要在 中使用<%#Eval %>语法HeaderTemplate,您应该尝试定义一些方法属性来访问您尝试使用的字段<%=MyEmpIdProperty %>

于 2013-07-01T18:17:59.097 回答
0

首先,您似乎没有返回名为“EmpID”的列。这是您的 SQL 语句的问题,恕我直言,不在此问题的范围内。话虽如此,一旦您修复了 SQL,您将如何在转发器的标头中绑定标签。

您可以使用中继器的OnItemDataBound 方法并查找e.Item.ItemType.Header

首先,将转发器绑定到OnItemDataBound事件。您可以在客户端或服务器端执行此操作:

  1. 客户端:

    <asp:Repeater ID="rptSample" runat="server" OnItemDataBound="rptSample_ItemDataBound">
    
  2. 服务器端:

    protected override void OnInit(EventArgs e)   
    {
       base.OnInit(e);
       this.rptSample.ItemDataBound += rptSample_ItemDataBound;
    }
    

然后您需要检查 ItemDataBound 方法中被绑定的项目的类型。像这样:

    protected void rptSample_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Header)
        {

        }
    }

为了能够dt3rptSample_ItemDataBound方法内部访问数据源 ( ),您需要将其设为页级变量。因此更改以下行:

DataTable dt3 = ds3.Tables[0];

放置以下行,使其成为页面级变量

 DataTable dt3 = null; 

并将 dt3 赋值行更改为:

dt3 = ds3.Tables[0];

然后您的 ItemDataBound 方法将如下所示:

    protected void rptSample_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Header)
        {
            ((Label)e.Item.FindControl("lblmonths")).Text = dt3.Rows[0]["EmpId"].ToString();
        }
    }
于 2013-07-01T23:57:35.610 回答