ASP.Net C#使用读卡器中的第一行

本文关键字:一行 Net 读卡器 ASP | 更新日期: 2023-09-27 17:59:08

conn = new SqlConnection(connectionString);
comm = new SqlCommand("Products.sl_Cartridges", conn);
comm.CommandType = CommandType.StoredProcedure;
comm.Parameters.Add(new SqlParameter("@PrinterID", SqlDbType.Int));
comm.Parameters["@PrinterID"].Value = varPrinterID;conn.Open();
reader = comm.ExecuteReader();
Cartridges.DataSource = reader;
Cartridges.DataBind();
reader.Close();

有没有办法在上面添加一些代码来提取这个中继器的第一个数据行的值?这只会节省我写一个单独的SP,这似乎是一种浪费。抱歉,我是.Net的新手!

ASP.Net C#使用读卡器中的第一行

如果返回的结果集非常小,则可以使用SqlDataAdapter将其转储到DataTable并获取第一行。这非常简单,但效率低下,因为如果结果大小很大,它会浪费大量不必要的数据流:

SqlDataAdapter adp = new SqlDataAdapter(comm);
DataTable dt = new DataTable();
adp.Fill(dt);
Cartridges.DataSource = new [] { dt.Rows[0] };
Cartridges.DataBind();

编辑:dt。行[0]无效,因为它必须是列表。替换为dt.Rows.Take(1)(如果您有LINQ(或new [] { dt.Rows[0] }

否则,您将需要从读取器的第一行获取所有值,并将它们转储到一个可以绑定到Cartridges控件的对象中:

var firstRow = new { Name = reader[0], Value = reader[1], Blah = reader[2], ... };
Cartridges.DataSource = firstRow;
Cartridges.DataBind();

此外,如果您使用DetailsView之类的控件而不是Repeater,它将自动一次只显示一行,并且您可以将其筛选为一行。

这不是一个很好的解决方案,但您可以为中继器的ItemDataBound事件添加一个处理程序,并将每个项目(第一个项目除外(的Visible属性设置为false:

标记:

<asp:Repeater ID="repeater" runat="server"
  OnItemDataBound="repeater_ItemDataBound">

代码背后:

private bool first = true;
void repeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (!first) e.Item.Visible = false;
    first = false;
}