2016-05-08 79 views
1

如何从组合框选择示例中过滤列表视图。从组合框选择过滤SQL Server中的列表视图

如果用户选择在下拉列表中的项目5*108则列表视图将显示所有具有项5*108在它这是在P.krydsmål

C#

 public partial class MainWindow : Window, INotifyPropertyChanged 
{ 

    public SqlConnection conn; 
    public SqlCommand cmd; 
    string connStrings = ConfigurationManager.AppSettings["Sql"]; 
    string Data = @"Select ps.Mærket AS Mærke, P.DataID, P.Billed, P.Model, P.Årgang, P.[Motor Type], P.Krydsmål, P.Centerhul, P.ET,P.Bolter, P.Dæk, P.Fælge ,PS.Krydsmålene from Data.Hjuldata P inner join Data.Mærke PS on P.MærkeID = PS.MærkeID ORDER BY ps.Mærket"; 
    public event PropertyChangedEventHandler PropertyChanged; 
    private string _selectedParam; 
    public MainWindow() 
    { 
     InitializeComponent(); 
BindData() 
ICollectionView dataView = CollectionViewSource.GetDefaultView(hjuldata.ItemsSource); 
      dataView.GroupDescriptions.Add(new PropertyGroupDescription("Mærke")); 

    } 
    private void NotifyPropertyChanged(String info) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(info)); 
     } 
    } 
    public string SelectedParam { get { return _selectedParam; } set { _selectedParam = value; NotifyPropertyChanged("SelectedParam"); if (_selectedParam == "ingen") { BindData(); } else { hjuldata.ItemsSource = FilterKategori().Tables[0].DefaultView; ; } } } 
    private void BindData() 
    { 
     hjuldata.ItemsSource = kategori().Tables[0].DefaultView; 

    } 
    public DataSet kategori() 
    { 
     //SQL statement to fetch entries from Hjuldata 
     DataSet dsdata = new DataSet(); 

     //Open SQL Connection 
     using (conn = new SqlConnection(connStrings)) 
     { 
      conn.Open(); 

      //Initialize command object 
      using (conn = new SqlConnection(connStrings)) 
      using (SqlCommand cmd = new SqlCommand(Data, conn)) 
      {     
       SqlDataAdapter adapters = new SqlDataAdapter(cmd); 

       //Fill the result set 
       adapters.Fill(dsdata); 
       conn.Close(); 
      } 
     } 
     return dsdata; 
    } 
    public DataSet FilterKategori() 
    { 

    string Data = @"Select ps.Mærket AS Mærke, P.DataID, P.Billed, P.Model, 
P.Årgang, P.[Motor Type], P.Krydsmål, P.Centerhul, P.ET,P.Bolter, 
P.Dæk, P.Fælge ,PS.Krydsmålene from Data.Hjuldata P 
inner join Data.Mærke PS on P.MærkeID = PS.MærkeID 
WHERE Krydsmål = @param1";//only works with '5*108' 





//SQL statement to fetch entries from products 
      DataSet dsdata = new DataSet(); 

      //Open SQL Connection 
      using (conn = new SqlConnection(connStrings)) 
      { 
       conn.Open(); 

       //Initialize command object 
       using (SqlCommand cmds = new SqlCommand(Data, conn)) 
       { 
        cmds.Parameters.AddWithValue("@param1", SelectedParam); 
        SqlDataAdapter adapters = new SqlDataAdapter(cmds); 
        //Fill the result set 
        adapters.Fill(dsdata); 
       } 

      } 
      return dsdata; 
     } 

组合框

<ComboBox x:Name="comboBox_Copy" Width="150" Height="40" Foreground="#FF00FB0B" Background="#FF303030" FontSize="16" Canvas.Left="1030" Canvas.Top="24" Style="{StaticResource ComboBoxTest2}" SelectedItem = "{Binding SelectedParam, ElementName=win, UpdateSourceTrigger=PropertyChanged}"> 
         <ComboBoxItem Content="Ingen"/> 
         <ComboBoxItem Content="3x98"/> 
         <ComboBoxItem Content="3x112"/> 
         <ComboBoxItem Content="4x98"/> 
         <ComboBoxItem Content="4x100"/> 
         <ComboBoxItem Content="4x108"/> 
         <ComboBoxItem Content="4x114.3"/> 
         <ComboBoxItem Content="4x160"/> 
         <ComboBoxItem Content="5x98"/> 
         <ComboBoxItem Content="5x100"/> 
         <ComboBoxItem Content="5x108"/> 

回答

1

现在你已经表明SelectedParam的调试值,我得到了这个问题。问题在于组合框。你的组合框应该是这样的:

<ComboBox x:Name="comboBox_Copy" Width="150" Height="40" Foreground="#FF00FB0B" Background="#FF303030" FontSize="16" 
     SelectedValuePath="Content" 
     SelectedValue = "{Binding SelectedParam, ElementName=win, UpdateSourceTrigger=PropertyChanged}"> 
      <ComboBoxItem Content="Ingen"/> 
      <ComboBoxItem Content="3x98"/> 
      <ComboBoxItem Content="3x112"/> 
      <ComboBoxItem Content="4x98"/> 
      <ComboBoxItem Content="4x100"/> 
      <ComboBoxItem Content="4x108"/> 
      <ComboBoxItem Content="4x114.3"/> 
      <ComboBoxItem Content="4x160"/> 
      <ComboBoxItem Content="5x98"/> 
      <ComboBoxItem Content="5x100"/> 
      <ComboBoxItem Content="5x108"/> 

</ComboBox> 

注意SelectedValuePath。这将发送到SelectedParam字符串而不是对象ComboBoxItem。

看到一个演示在我的github:DemoCombo

请注意名称,矿山可以是你的不同...

+0

多数民众赞成在工作,所以现在我只需要弄清楚如何让这个分组工作,但至少它解决了我的问题 –

+0

它给我这个当我尝试它与分组 异常抛出:'System.Data.SqlClient.SqlException'在System.Data.dll 附加信息:参数化查询'(@param1 nvarchar ASMærke,P.DataID,PB'预计未提供参数'@ param1'。 –

+0

这个messagem'期望参数'@ param1',它没有提供'说你有一个参数定义在你的SQL语句中,但是你没有提供它的值。 – quicoli

3

我会建议使用MVVM模式,以使您的工作更轻松。但是当你使用的是后台代码:

1 - 你的窗口执行INotifyPropertyChanged:

public class MainWindow: Window, INotifyPropertyChanged 
{ 
    //Existing code.... 


    public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyPropertyChanged(String info) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(info)); 
     } 
    } 
} 

2 - 定义的属性和代表所选项目在您组合框,并在其制定者,你可以触发你的过滤方法:

private string _selectedParam; 
public string SelectedParam 
{ 
    get{return _selectedParam;} 
    set 
    { 
    _selectedParam = value; 
    NotifyPropertyChanged("SelectedParam"); 
    hjuldata.ItemsSource = FilterKategori(_selectedParam).Tables[0].DefaultView; 

    } 
} 

3 - 绑定组合框的SelectedItem到您的新属性:

<ComboBox x:Name="comboBox_Copy" 
      SelectedItem = "{Binding SelectedParam, ElementName=YourWindowsName, UpdateSourceTrigger=PropertyChanged}" 
      Width="150" Height="40" 
      Foreground="#FF00FB0B" Background="#FF303030" FontSize="16" 
      Canvas.Left="1030" Canvas.Top="24"> 
    <ComboBox.Resources> 
     <SolidColorBrush x:Key="{x:Static SystemColors.WindowBrushKey}" Color="#FF303030" /> 
    </ComboBox.Resources> 
    <ComboBoxItem Content="Ingen"/> 
    <ComboBoxItem Content="3*98"/> 
    <ComboBoxItem Content="3*112"/> 
</ComboBox> 

4 - 创建FilterKategori

public DataSet FilterKategori() 
{ 

string Data = @"SELECT [DataID], [MærkeID], [Billed], [Model], [Årgang], [Motor Type], [Krydsmål], [Centerhul], 
    [ET], [Møtrikker], [Bolter], [Dæk], [Fælge] 
FROM 
    [OminiData].[Data].[Hjuldata] 
WHERE 
    Krydsmål = @param1"; 

//SQL statement to fetch entries from products 
DataSet dsdata = new DataSet(); 

//Open SQL Connection 
using (SqlConnection conns = new SqlConnection(connStrings)) 
{ 
conns.Open(); 

//Initialize command object 
using (SqlCommand cmds = new SqlCommand(Data, conns)) 
{ 
    cmds.Parameters.AddWithValue("@param1", SelectedParam); 
    SqlDataAdapter adapters = new SqlDataAdapter(cmds); 
    //Fill the result set 
    adapters.Fill(dsdata); 
} 

}  
return dsdata; 
} 
+0

看起来可能是解决如何使它当ingen被选中,那么它将显示所有的项目,而不是过滤它,以及如果我不想从另一个组合框更多地过滤它,那么它将显示所有项目以及如何进行多重过滤 –

+0

“Ingen”是指“全部”?好的。只需验证选择什么: 公共字符串SelectedParam { 得到{_selectedParam;} 设置 { _selectedParam =值; NotifyPropertyChanged(“SelectedParam”); (_selectedParam ==“ingen”) { BindData();如果(_selectedParam ==“ingen”) } else hjuldata.ItemsSource = FilterKategori(_selectedParam).Tables [0]。默认视图; } } } – quicoli

+0

现在,关于甚至过滤,你可以使用相同的原理 – quicoli

相关问题