Привязка ListView C# WPF

Итак, у меня есть этот код. Я хочу удалить из базы данных при выборе строки ListView. Моя идея состоит в том, чтобы удалить из таблицы с выбранным идентификатором.
Я пробовал, listViewScenarist.SelectedItems[0].SubItems[0]но код не распознает SubItems[0]. Что я могу сделать?

public class UserScenarist : Scenarist
{
    public int idScenarist { get; set; }
    public string numeScenarist { get; set; }
}

public void deleteScenarist(System.Windows.Controls.ListView listScenarist)
{
    connection.Open();
    SqlCommand cmd = new SqlCommand("DELETE FROM dbo.Scenarist WHERE idScenarist=@idScenarist", connection);
    int x = Convert.ToInt32(listScenarist.SelectedIndex);
    cmd.Parameters.AddWithValue("@idScenarist", listViewScenarist.SeletedItems[x].SubItems[0]);
    cmd.ExecuteNonQuery();
    connection.Close();
}

Населять:

public void loadScenarist(System.Windows.Controls.ListView listScenarist)
{
    connection.Open();
    SqlCommand cmd = new SqlCommand("SELECT * FROM dbo.Scenarist ORDER BY idScenarist ASC", connection);

    try
    {
        SqlDataAdapter da = new SqlDataAdapter();
        da.SelectCommand = cmd;
        DataTable dt = new DataTable();
        da.Fill(dt);
        listScenarist.Items.Clear();
        foreach (DataRow dr in dt.Rows)
        {  
            List<UserScenarist> items = new List<UserScenarist>();
            items.Add(new UserScenarist() { idScenarist = Int32.Parse(dr["idScenarist"].ToString()), numeScenarist = dr["scenarist"].ToString() });
            //System.Windows.MessageBox.Show(dr["idScenarist"].ToString());
            listScenarist.Items.Add(items);
        }
    }
    catch (Exception ex)
    {
        System.Windows.MessageBox.Show(ex.Message);
    }
    connection.Close();
}

2 ответа

  1. Чтобы найтиidScenarist, вы можете просто бросить listViewScenarist.SelectedItemк вашей UserScenaristмодели, а затем выбратьidScenarist, как это:

    int idScenarist = (listViewScenarist.SelectedItem as UserScenarist).idScenarist;
    

    Затем:

    cmd.Parameters.AddWithValue("@idScenarist", idScenarist);
    
  2. Это имеет очень мало общего с привязкой, но ваша первая проблема заключается в том , что каждый раз, когда вы добавляетеList<UserScenarist>, только один элемент, как элемент.

    Вместо этого создайте один список, добавьте элементы в этот список, а затем установите ItemsSourceс этим списком.

    var items = new List<UserScenarist>();
    foreach (DataRow dr in dt.Rows)
    {  
        items.Add(new UserScenarist() { 
                     idScenarist = Int32.Parse(dr["idScenarist"].ToString()), 
                     numeScenarist = dr["scenarist"].ToString() 
                 });
    }
    listScenarist.ItemsSource = items;
    

    если вы исправите это, как указано выше, то вы можете бросить SelectedItem(s)какUserScenarist

    var selectedId = (listViewScenarist.SeletedItem as UserScenarist).idScenarist; 
    

    или

    var selectedId = (listViewScenarist.SeletedItems[x] as UserScenarist).idScenarist; 
    

    кроме того, ваш код

    int x = Convert.ToInt32(listScenarist.SelectedIndex);
    listViewScenarist.SeletedItems[x]
    

    не будет работать и будет, почти все время, выбрасывать из диапазона исключения. SelectedIndexявляется глобальным для всех элементов и будет варьироваться от 0 до 1. SelectedItemsоднако будет иметь только выбранные элементы, поэтому его длина будет варьироваться только от 0 до выбранного количества элементов-1. Нельзя использовать SelectedIndexдля получения элементов изSelectedItems