1

I'm using WPF C# Visual Studio 2012. I have a Listview in my xaml like:

<ListView 
    Name="listview" 
    Grid.Column="0"                
    Grid.ColumnSpan="2" 
    Grid.Row="1"
    Grid.RowSpan="15"
    Margin="5"
    BorderThickness="0"
    Background="WhiteSmoke">
    <ListView.View>
        <GridView>
            <GridView.Columns>
                <GridViewColumn 
                    Header="column1" 
                    DisplayMemberBinding="{Binding path}" />
                <!--other path-->
            </GridView.Columns>
        </GridView>
    </ListView.View>
</ListView>

The code behind to fill this Listview (in xaml.cs):

NpgsqlConnection connection = new NpgsqlConnection("Server = " + myModule.Server + ";Port = " + myModule.Port + ";User ID = " + myModule.UserID + ";Password = " + myModule.Password + ";Database = " + myModule.Database);
connection.Open();
NpgsqlCommand command = new NpgsqlCommand("select * from tblstudents_secure order by stud_id ASC", connection);

command.Connection = connection;
NpgsqlDataAdapter adapter = new NpgsqlDataAdapter(command);


DataSet ds=new DataSet ();
adapter.Fill(ds);
listview.ItemsSource = ds.Tables[0].DefaultView;

When I run my program, I know that it fills the listview because I can see it's rows when I hover my mouse on that, but I cannot see any text on those rows!

What did I miss?

1
  • is "Path" a property/columc of the data ? DisplayMemberBinding="{Binding path}" Commented Mar 29, 2017 at 6:12

2 Answers 2

4

I found this solution:

In my XAML:

<ListView 
    Margin="10" 
    Name="lvDataBinding">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Student Number" Width="100" DisplayMemberBinding="{Binding list_studid}" />
            <GridViewColumn Header="First Name" Width="100" DisplayMemberBinding="{Binding list_studfname}" />
            <GridViewColumn Header="Middle Name" Width="100" DisplayMemberBinding="{Binding list_studmname}" />
            <GridViewColumn Header="Last Name" Width="100" DisplayMemberBinding="{Binding list_studlname}" />
        </GridView>
    </ListView.View>
</ListView>

In my xaml.cs:

public class User
{
    public string list_studid { get; set; }
    public string list_studfname { get; set; }
    public string list_studmname { get; set; }
    public string list_studlname { get; set; }
}


public void cmdSearch_Click(object sender, RoutedEventArgs e)
{
    NpgsqlConnection iConnect = new NpgsqlConnection
                                    ("Server = " + myModule.Server + ";
                                      Port = " + myModule.Port + ";
                                      User ID = " + myModule.UserID + ";
                                      Password = " + myModule.Password + ";
                                      Database = " + myModule.Database);
    iConnect.Open();
    NpgsqlCommand iQuery = new NpgsqlCommand("Select * from tblstudents_secure", iConnect);
    iQuery.Connection = iConnect;
    NpgsqlDataAdapter iAdapter = new NpgsqlDataAdapter(iQuery);

    DataSet iDataSet = new DataSet();
    iAdapter.Fill(iDataSet, "LIST");
    
    int lstCount = iDataSet.Tables["LIST"].Rows.Count;//lstCount holds the total count of the list from database

    int i = 0;//used as counter
    List<User> items = new List<User>();
    while (lstCount > i)
    {

        items.Add(new User()
        {
            list_studid = iDataSet.Tables["LIST"].Rows[i]["stud_id"].ToString(),
            list_studfname = iDataSet.Tables["LIST"].Rows[i]["stud_fname"].ToString(),
            list_studmname = iDataSet.Tables["LIST"].Rows[i]["stud_mname"].ToString(),
            list_studlname = iDataSet.Tables["LIST"].Rows[i]["stud_lname"].ToString()
        });

        lvDataBinding.ItemsSource = items;//lvDataBinding is the name of my ListView

        i++;
    }
}

Explanation:

In my design (XAML), the DisplayMemberBinding property of the GridViewColumn holds the Binding List, which from code behind is list_studid, list_studfname, list_studmname, list_studlname. Now, we have a "catcher" on our design, we set the "thrower" from our code behind.

The public class User holds and initializes the binding list – list_studid, list_studfname, etc.

Upon user CLICK on my button (cmdSearch), we call the database, open it, perform select query, fill it into the dataset, and loop until the end of the list.

Now the "thrower" starts on the loop, including the List<User> items = new List<User>(); . While looping, the list_studid, etc. holds the data from the database (list_studid = iDataSet.Tables["LIST"].Rows[i]["stud_id"].ToString()) and converts it to string (.ToString()).

Then we "throw" it to the listview in lvDataBinding.ItemsSource = items;. And as I have said, the design (XAML) "catches" this "throw", and loads it to the listview.

Sign up to request clarification or add additional context in comments.

1 Comment

For anyone having a: This exception was thrown because the generator for control 'System.Windows.Controls.DataGrid Items.Count:5' with name '(unnamed)' has received sequence of CollectionChanged events that do not agree with the current state of the Items collection. The following differences were detected: Accumulated count 4 is different from actual count 5. [Accumulated count is (Count at last Reset + #Adds - #Removes since last Reset).] Add this code after While iteration is done. 'lvDataBinding.Items.Refresh();
0

Well It's hard to help you with this little information about your entities... But I would bet the entities in your DB dont have a path property.

This example worked for me:

   <ListView 
            Name="listview" 
            Grid.Column="0"                
            Grid.ColumnSpan="2" 
            Grid.Row="1"
            Grid.RowSpan="15"
            Margin="5"
            BorderThickness="0"
            Background="WhiteSmoke">
        <ListView.View>
            <GridView>
                <GridView.Columns>
                    <GridViewColumn 
                            Header="column1" 
                            DisplayMemberBinding="{Binding Path}" />
                    <!--other path-->
                </GridView.Columns>
            </GridView>
        </ListView.View>
    </ListView>

CodeBehind:

   public partial class MainWindow : Window
   {
    public MainWindow()
   {
       InitializeComponent();
       var bla = new ObservableCollection<Car>()
       {
          new Car()
       };

       listview.ItemsSource = bla;
   }
 }

 public class Car
 {
   public Car()
  {
     Path = "bla";
  }
   public string Path { get; set; }
 }

notice the Property Path on my Car class and the line DisplayMemberBinding="{Binding Path}" in the view.

regards

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.