【问题标题】:ListView C# WPF BindingListView C# WPF 绑定
【发布时间】:2016-05-29 16:59:36
【问题描述】:

所以我有这个代码。当我在ListView 中选择一行时,我想从数据库中删除。我的想法是从具有选定 ID 的表中删除。 我尝试使用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();
}

【问题讨论】:

  • 你试过 listViewScenarist.Items[x] 吗??
  • @LeonardH 我不知道你如何填充你的列表,但SelectedItem(s) 应该是你的项目类型,所以:(listViewScenarist.SeletedItems[x] as UserScenarist).idScenarist

标签: c# .net wpf listview


【解决方案1】:

这与绑定关系不大,但你的第一个问题是每次添加List&lt;UserScenarist&gt;,只有一个项目,作为项目。

改为创建一个列表,将项目添加到该列表,然后使用该列表设置 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。您不能使用 @ 987654331@从SelectedItems获取物品

【讨论】:

    【解决方案2】:

    要找到idScenarist,您只需将listViewScenarist.SelectedItem 转换为UserScenarist 模型,然后像这样选择idScenarist:

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

    然后:

    cmd.Parameters.AddWithValue("@idScenarist", idScenarist);
    

    【讨论】:

    • 不工作.. 错误:“对象引用未设置为对象的实例。”
    • @LeonardH...您应该首先在ListView 中选择一个项目,然后调用deleteScenarist 方法。
    • @LeonardH...我不知道你是如何调用deleteScenarist 方法的,但我相信这段代码应该能如你所愿。
    猜你喜欢
    • 1970-01-01
    • 2016-11-20
    • 2011-08-19
    • 1970-01-01
    • 2016-09-23
    • 1970-01-01
    • 2010-10-08
    • 2011-01-01
    • 2011-01-14
    相关资源
    最近更新 更多