【问题标题】:How to bind datalist from code behind in asp.net如何从asp.net中的代码绑定datalist
【发布时间】:2015-02-07 23:21:15
【问题描述】:

我想从asp.net后面的代码中绑定datalist

我从列表中获取产品 ID 并根据它们的基础选择所有产品

以下是我的代码:

List<string> r_items_grid = (List<string>)Session["recent_items"];

for(int i=0; i < r_items_grid.Count; i++)
{

    OleDbCommand cmd_r_items= new OleDbCommand("SELECT product_id,product_name,product_price,product_image_1 from products where product_id="+ Convert.ToInt32( r_items_grid[i]),con); 
    r_items_reader=cmd_r_items.ExecuteReader();

    DataList3.DataSource = r_items_reader;
    DataList3.DataBind(); 
}

但我只看到数据列表中的最后一条记录

【问题讨论】:

  • 这很明显,因为对于每次迭代,您都在更改 DatasSource (DS) 并重新绑定它,而不是这样做,您应该只分配 DS 一次并且只绑定一次,并且应该在 for 循环之外。
  • 另外,小心那个 sql 命令检查你的参数。

标签: c# asp.net datalist


【解决方案1】:

如果我没记错的话,您正在尝试将字符串列表放入会话中。当您每次遍历整个列表时,将数据列表(DataList3)与基于列表索引值的新字符串绑定。所以它总是显示列表的最后一个字符串值。如果你想根据你的列表获取所有数据,你可以使用这个

List<string> r_items_grid = (List<string>)Session["recent_items"];

string items_id= string.Join(",", r_items_grid);// items_id may be like 1,2,3,4,5.

OleDbCommand cmd_r_items= new OleDbCommand("SELECT product_id,product_name,product_price,product_image_1 from products where product_id IN ("+ items_id + ")",con); 
r_items_reader=cmd_r_items.ExecuteReader();

DataList3.DataSource = r_items_reader;
DataList3.DataBind();

"SELECT product_id,product_name,product_price,product_image_1 from products where product_id IN (1,2,3,4,5...)"查询用于获取items_id为1,2,3,4的所有数据,5...

【讨论】:

    【解决方案2】:

    问题是您一次选择一条记录,然后将其分配给数据源。当您这样做时,先前的值将被覆盖。所以你只能看到最后一个查询的结果。您可以通过发出单个请求然后将其绑定到列表来修复它:

    假设您知道Session["recent_items"] 存储整数,下面的代码可以工作,如果有可能将字符串存储在那里,您将面临 SQL 注入的风险。

    List<string> r_items_grid = (List<string>)Session["recent_items"];
    
    string ids = string.Join(",", r_items_grid);    // Here you get IDs in format 1,2,3,4,5 etc.
    
    OleDbCommand cmd_r_items= new OleDbCommand("SELECT product_id,product_name,product_price,product_image_1 from products where product_id IN ("+ ids + ")",con); 
    r_items_reader=cmd_r_items.ExecuteReader();
    
    DataList3.DataSource = r_items_reader;
    DataList3.DataBind(); 
    

    【讨论】:

      【解决方案3】:

      没有必要循环

      您可以使用逗号分隔的列表

      string  commaSepara = String.Join(",", r_items_grid);
      
      OleDbParameters commaSepara=new OleDbParameters("@commaSepara",SqlDbType.NVarchar,-1);
      commaSepara.Value=commaSepara;
      OleDbCommand cmd_r_items= new OleDbCommand(@"SELECT product_id,product_name,product_price,product_image_1 from products where product_id
       IN ( @commaSepara )",con); 
      
      
      r_items_reader=cmd_r_items.ExecuteReader();
      
      DataList3.DataSource = r_items_reader;
      DataList3.DataBind(); 
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-30
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-15
      相关资源
      最近更新 更多