【问题标题】:gridview with multi select listbox带有多选列表框的gridview
【发布时间】:2011-10-05 12:31:10
【问题描述】:

您好我有一个绑定到数据库中的表的列表框。它会产生一份公司名单。然后,用户将出现并选择他们想要查看信息的多个公司,然后他们点击一个选择按钮,该按钮将在下面的网格视图中显示公司信息(例如公司名称、公司站点、地址等)。但是我遇到的问题是它只显示选择的多家公司中的一家,而且它始终是第一家。

有人可以解释一下我如何让所有公司都显示在网格视图中吗?

我正在 vb.net 中编程

请看下面的源代码

<asp:ListBox ID="ListBox1" runat="server" 
        DataSourceID="SqlDataSource11" DataTextField="compName" 
        DataValueField="compDataID" SelectionMode="Multiple" AutoPostBack="True"></asp:ListBox>
    <asp:SqlDataSource ID="SqlDataSource11" runat="server" 
        ConnectionString="<%$ ConnectionStrings:IWSRiskAssessmentConnectionString %>" 
        SelectCommand="SELECT [compDataID], [compName] FROM [tblCompany] WHERE ([compDataID] &lt;&gt; @compDataID) ORDER BY [compName]">
        <SelectParameters>
            <asp:ControlParameter ControlID="DropDownList1" Name="compDataID" 
                PropertyName="SelectedValue" Type="Int32" />
        </SelectParameters>
    </asp:SqlDataSource>
<asp:GridView 
        ID="GridView1" runat="server" AllowPaging="True" AutoGenerateColumns="False" 
        DataSourceID="SqlDataSource2">
        <Columns>
            <asp:BoundField DataField="compName" HeaderText="compName" 
                SortExpression="compName" />
            <asp:BoundField DataField="Site Name" HeaderText="Site Name" 
                SortExpression="Site Name" />
            <asp:BoundField DataField="Reference Number" HeaderText="Reference Number" 
                SortExpression="Reference Number" />
            <asp:BoundField DataField="Asset" HeaderText="Asset" ReadOnly="True" 
                SortExpression="Asset" />
            <asp:BoundField DataField="Location" HeaderText="Location" 
                SortExpression="Location" />
            <asp:BoundField DataField="Block" HeaderText="Block" SortExpression="Block" />
            <asp:BoundField DataField="Room" HeaderText="Room" SortExpression="Room" />
        </Columns>
    </asp:GridView>
    <asp:SqlDataSource ID="SqlDataSource2" runat="server" 
        ConnectionString="<%$ ConnectionStrings:IWSRiskAssessmentConnectionString %>" 
        SelectCommand="SELECT tblCompany.compName, tblSite.siteName AS [Site Name], tblSite.siteUPRN AS [Reference Number], tblIncMain.incAsset + ' ' + CAST(tblIncMain.incNumber AS varchar) AS Asset, tblIncMain.incLocation AS Location, tblIncMain.incBlock AS Block, tblIncMain.incRoom AS Room FROM tblIncMain INNER JOIN tblSite ON tblIncMain.incSite = tblSite.siteID INNER JOIN tblCompany ON tblSite.siteCompany = tblCompany.compDataID WHERE (tblIncMain.incActive = 1) AND (tblSite.siteActive = 1) AND (tblIncMain.incRemoved = 0) AND (tblCompany.compDataID = @compDataID) ORDER BY [Site Name], tblIncMain.incAsset, tblIncMain.incNumber">
        <SelectParameters>
            <asp:ControlParameter ControlID="ListBox1" Name="compDataID" 
                PropertyName="SelectedValue" />
        </SelectParameters>
    </asp:SqlDataSource>

这是源代码 :-) 请看一下,非常感谢任何帮助

【问题讨论】:

  • 您应该提供源代码,否则我们看不到问题所在。您在哪里以及如何将 GridView 绑定到它的 DataSource?
  • 我的问题已被编辑,我已添加源代码,谢谢

标签: asp.net vb.net gridview listbox


【解决方案1】:

可能是每次请求都会执行 DataBind 代码,或者您没有从列表框中收集选定的项目。

  Sub page_load()
     if Not IsPostBack Then

     End If
   End sub

并迭代列表框项,

For Each item in ListBox1.Items
  if item.Selected then
  End If
Next

【讨论】:

    【解决方案2】:

    您的数据源仅选择 1 条记录。当您使用多选 ListBox 作为 ControlParameter 时,ListBox 将返回第一个值。

    (tblCompany.compDataID = @compDataID)
    

    你想要做的是有一个 IN 声明,例如

    (tblCompany.compDataID in @compData) 
    

    你可能需要在后面的代码中做一些事情。

    <asp:ListBox ID="ListBox1" runat="server" 
            AutoPostBack="True"
            DataTextField="compName" 
            DataSourceID="SqlDataSource11"
            DataValueField="compDataID"
            OnSelectedIndexChanged="ListBox1_SelectedIndexChanged"
            SelectionMode="Multiple">
    </asp:ListBox>
    

    后面的代码

    protected void ListBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
      string s = string.Empty;
      foreach (ListItem li in ListBox1.Items)
      {
        if (li.Selected == true)
          s += li.Value + ",";
      }
    
      if (s != string.Empty)
      {
        s = s.Substring(0, s.Length - 2); // chop off trailing ,
        SqlDataSource2.SelectParameters["compData"].DefaultValue = s;
      }  
    }
    

    注意这尚未经过测试,但它是您可以尝试的一种选择。基本上,您需要 IN 而不是 = 供您选择以获得所有结果。

    【讨论】:

    • 非常感谢您,但是当我尝试从列表框中选择一家公司时,我收到此错误 Incorrect syntax near '@compDataID'
    • 很难说没有看到你的源代码是什么问题。听起来SQL查询中有错误。解决这个问题的最好办法是打印出最终的 sql 语句并查看错​​误在哪里。
    【解决方案3】:

    好的,所以我在我的 sql 语句中添加了“in”,但是它仍然只从列表框中选择一个而不是多个选择这是 sql 语句:

    SELECT tblCompany.compName, tblSite.siteName AS [Site Name], tblSite.siteUPRN AS [Reference Number], tblIncMain.incAsset + " " + CAST(tblIncMain.incNumber AS varchar) AS Asset, tblIncMain.incLocation AS Location, tblIncMain.incBlock AS Block, tblIncMain.incRoom AS Room FROM tblIncMain INNER JOIN tblSite ON tblIncMain.incSite = tblSite.siteID INNER JOIN tblCompany ON tblSite.siteCompany = tblCompany.compDataID WHERE (tblIncMain.incActive = 1) AND (tblSite.siteActive = 1) AND (tblIncMain.incRemoved = 0) AND tblCompany.compDataID in(@compDataID) ORDER BY [Site Name], tblIncMain.incAsset, tblIncMain.incNumber
    

    【讨论】:

      猜你喜欢
      • 2011-08-04
      • 2011-12-11
      • 1970-01-01
      • 1970-01-01
      • 2014-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多