gridview with multi select listbox

时间:2011-10-05 12:31:10

标签: asp.net vb.net gridview listbox

HiI有一个绑定到数据库中的表的列表框。它产生了一系列公司。然后,用户将出现并选择他们想要查看有关信息的多个公司,然后他们点击一个selet按钮,该按钮在下面的gridview中显示公司信息(例如公司名称,公司站点,地址e.t.c)。然而,我遇到的问题是,它只显示选定的多家公司中的一家,而且它始终是最重要的公司之一。

有人可以了解我如何让所有公司在gridview中显示?

我在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>

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

3 个答案:

答案 0 :(得分:0)

可能是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

答案 1 :(得分:0)

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

(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而非=才能获得所有结果。

答案 2 :(得分:0)

好吧所以我在我的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