2016-05-08 78 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

相關問題