Click here to Skip to main content
15,884,472 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
I tried to make a autoComplete textbox like google Search with C# in a WPF application, basically what I want to do is have a autocomplete textbox which is bound to a sql database table. the table has 2 fields(Barcode and Name),my code as below:

In XMAL :

XML
<Grid>
       <Grid.RowDefinitions>
           <RowDefinition Height="37*" />
           <RowDefinition Height="88*" />
       </Grid.RowDefinitions>
       <TextBlock Text="Type Your Search :" HorizontalAlignment="Left"
                  VerticalAlignment="Bottom" Width="112" Height="15.96" Margin="31,0,0,4" />

       <TextBox HorizontalAlignment="Right" VerticalAlignment="Bottom"
                Height="25" Width="325" Margin="0,0,10,0" x:Name="txtCAuto" TextWrapping="NoWrap" />

       <ListBox x:Name="lbSuggestion" SelectionChanged="lbSuggestion_SelectionChanged"
           removed="LightYellow" Grid.Row="1" Visibility="Collapsed"
                HorizontalAlignment="Right" VerticalAlignment="Top" Width="325" Margin="0,0,10,0"/>
   </Grid>

Code Behind:
C#
    List<string> nameList;
    List<Product> prodList;

    public List<string> SelProd4Sale(string str )
    {
        string constr = "Data Source=.;Initial Catalog=AgamistaStore;User ID=emad2012;Password=emad_2012";
        SqlConnection SqlCon = new SqlConnection(constr);
        SqlCommand SqlCmdProds = new SqlCommand();
        SqlCmdProds.Connection = SqlCon;
        SqlCmdProds.CommandType = CommandType.Text;
        SqlCmdProds.CommandText = "SELECT dbo.ProductsTbl.ProductID,ProductsTbl.ProductBarcode," +
            "dbo.ProductsTbl.ProductName, dbo.ProductsTbl.SalePrice FROM dbo.ProductsTbl ";
        SqlCon.Open();
        SqlDataAdapter dapProds = new SqlDataAdapter();
        dapProds.SelectCommand = SqlCmdProds;
        DataSet dsProds = new DataSet();
        dapProds.Fill(dsProds);
        SqlCon.Close();
        prodList = new List<Product>();
        for (int i = 0; i < dsProds.Tables[0].Rows.Count; i++)
        {
            prodList.Add(new Product
                            (dsProds.Tables[0].Rows[i]["ProductBarcode"].ToString(),
                            dsProds.Tables[0].Rows[i]["ProductName"].ToString());
        }
        dsProds = null;

        nameList = new List<string>()
        {
           prodList.ToString()
        };

        return nameList;
    }

    public Window2()
    {
        InitializeComponent();
        SelProd4Sale(txtCAuto.Text);
        txtCAuto.TextChanged += new TextChangedEventHandler(txtAuto_TextChanged);
    }

    #region TextBox-TextChanged-txtAuto
    private void txtAuto_TextChanged(object sender, TextChangedEventArgs e)
    {
        string typedString = txtCAuto.Text.ToUpper();
        List<string> autoList = new List<string>();
        autoList.Clear();

        foreach (string item in nameList)
        {
            if (!string.IsNullOrEmpty(txtCAuto.Text))
            {
                if (item.StartsWith(typedString))
                {
                    autoList.Add(item);
                }
            }
        }

        if (autoList.Count > 0)
        {
            lbSuggestion.ItemsSource = autoList;
            lbSuggestion.Visibility = Visibility.Visible;
        }
        else if (txtCAuto.Text.Equals(""))
        {
            lbSuggestion.Visibility = Visibility.Collapsed;
            lbSuggestion.ItemsSource = null;
        }
        else
        {
            lbSuggestion.Visibility = Visibility.Collapsed;
            lbSuggestion.ItemsSource = null;
        }
    }
    #endregion

    #region ListBox-SelectionChanged-lbSuggestion
    private void lbSuggestion_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (lbSuggestion.ItemsSource != null)
        {
            lbSuggestion.Visibility = Visibility.Collapsed;
            txtCAuto.TextChanged -= new TextChangedEventHandler(txtAuto_TextChanged);
            if (lbSuggestion.SelectedIndex != -1)
            {
                txtCAuto.Text = lbSuggestion.SelectedItem.ToString();
            }
            txtCAuto.TextChanged += new TextChangedEventHandler(txtAuto_TextChanged);
        }
    }
    #endregion
}

class Product
{
    private string _ProductBarcode = "";
    private string _ProductName = "";

    public Product(string prodName,string prodBarcode)
    {
        this._ProductBarcode = prodBarcode;
        this._ProductName = prodName;
    }

    public string ProductBarcode
    {
        get { return _ProductBarcode; }
        set { _ProductBarcode = value; }
    }

    public string ProductName
    {
        get { return _ProductName; }
        set { _ProductName = value; }
    }

}

When I run this I got "System.Collections.Generic.List" as result instead of data.

Can somebody help me please & tell me what 's wrong?

Thanks.
Posted
Updated 13-Dec-12 7:14am
v7
Comments
Richard C Bishop 13-Dec-12 13:17pm    
ProgramFOX is correct, you are getting the ToString() of your list, not an actual item. I would suggest finding a property or another way to get the value you want.

Hi,

As ProgramFOX suggested,
C#
nameList = new List<string();
foreach (Product pr in prodList)
{
    nameList.Add(pr.ProductName);
}
is correct.

Then have to focus on the following section,
C#
foreach (string item in nameList)
{
    if (!string.IsNullOrEmpty(txtCAuto.Text))
    {
        if (item.StartsWith(typedString))
        {
            autoList.Add(item);
        }
    }
}

If SQL query is correct and returns data then check whether elements in nameList. If so check whether you reach autoList.Add(item) or not.

Regards.
 
Share this answer
 
Comments
Doudy_2020 15-Dec-12 10:54am    
SQL query is correct and returns data, & elements in namelist @debug mode have data also autoList has data, but lbSuggestion.ItemsSource does't have any data
And it also retrieve data in list for example if they are 4 products start with letter "p", the listbox show 4 rows but data hidden & when I select any row I got it in the textbox
A tip is to include ItemTemplate and ContentTemplate to your ListView and manipulate displayable data there.
 
Share this answer
 
I made little adjustment to your code.

From this to
C#
for (int i = 0; i < dsProds.Tables[0].Rows.Count; i++)
{
    prodList.Add(new Product
               (dsProds.Tables[0].Rows[i]["ProductBarcode"].ToString(),
               dsProds.Tables[0].Rows[i]["ProductName"].ToString());
}
dsProds = null;
nameList = new List<string>()
{
  prodList.ToString()
};
return nameList;


This.
C#
nameList = new List<string>();
for (int i = 0; i < dsProds.Tables[0].Rows.Count; i++)
{
    nameList.Add(dsProds.Tables[0].Rows[i]["ProductName"].ToString())
}
dsProds = null;
return nameList;
</string>
 
Share this answer
 
Comments
Doudy_2020 13-Dec-12 14:41pm    
I try your code, but it does't also retrieve any data
Jibesh 13-Dec-12 14:45pm    
"but it does't also retrieve any data"

It doesnt mean that code doesnt work. check your query returning any values. Have you tried debugging your application?
check your SQL query is working or not and it returns any rows.

what is the value of dsProds.Tables[0].Rows.Count ?
Doudy_2020 15-Dec-12 7:32am    
SQL query is working fine & it returns data, & when I debug my application it works fine with no error, & I got this data, but it doesn't show in listbox
I see this line of code:
C#
prodList.ToString();

List.ToString(); returns always "System.Collections.Generic.List".
I can't tell you what to do, because I don't know which result you want to get instead of "System.Collections.Generic.List".

[EDIT]

To show the product name, change this statement:
C#
nameList = new List<string>()
{
   prodList.ToString()
};

Into this:
C#
nameList = new List<string();
foreach (Product pr in prodList)
{
    nameList.Add(pr.ProductName);
}

[/EDIT]

Hope this helps.
 
Share this answer
 
v3
Comments
Doudy_2020 13-Dec-12 13:27pm    
I want to show "product name" as a result when the user type barcode in the textbox.
Thomas Daniels 13-Dec-12 13:40pm    
Ok. I updated my answer.
Doudy_2020 13-Dec-12 14:41pm    
I try your idea, but it does't retrieve any data

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900