【问题标题】:Selected item from listbox and display it to datagridview从列表框中选择的项目并将其显示到 datagridview
【发布时间】:2019-10-08 00:11:32
【问题描述】:

当我尝试将列表框中的项目添加到 datagridview 时,它会返回 system.data.datarowview

如何显示数据库中的所有值?我有一张表:ItemID、ItemName、Quantity、TransDate、ItemStatus

但我只想在 datagridview 中显示 id、名称、数量

将项目从列表框添加到数据网格视图的代码:

private void Checkout_Load(object sender, EventArgs e)
    {
        LoadData();
    }



    public void LoadData()
    {
        SqlConnection con = Connection.GetConnection();

        SqlDataAdapter sda = new SqlDataAdapter("Select * From [Inventory].[dbo].[Inventory]", con);

        DataTable dt = new DataTable();
        sda.Fill(dt);



        listBox1.DataSource = dt;
        listBox1.DisplayMember = "ItemName";
        listBox1.ValueMember = "ItemID";

        dataGridView1.Rows.Clear();


        foreach (var item in listBox1.SelectedItems)
        {
            int index = dataGridView1.Rows.Add();
            dataGridView1.Rows[index].Cells["Column1"].Value = item.ToString();
            dataGridView1.Rows[index].Cells["Column2"].Value = item.ToString();
            dataGridView1.Rows[index].Cells["Column3"].Value = textBox3.Text;
        }
    }





    private void buttonAddtoCart_Click(object sender, EventArgs e)
    {
        LoadData();
    }

【问题讨论】:

  • 太宽泛了。专注于您需要帮助的紧迫问题。
  • 我刚刚编辑了它.. 无论如何我需要帮助来显示从列表框到 datagridview 的选定项目。我想更新 xml 文件,例如我在结帐后选择了项目 Wallet Quantity 2

标签: c# sql datagridview listbox


【解决方案1】:

首先要做的是创建一个类(或结构,但最好是一个类)CartItem 来保存数据。

public class CartItem
{
    public int ID { get; set; }
    public string Name { get; set; }
    public int Quantity { get; set; }

    public override string ToString()  // For displaying the Name in a listbox
    {
        return Name;
    }
}

然后,在您的应用程序中创建一个包含对象的List<CartItem> 集合,并将该列表分配给DataGridViewDataSource 属性。

List<CartItem> cartItems = new List<CartItem>();
dataGridView2.DataSource = cartItems;

那么添加一个新的CartItem 的代码是:

private void buttonAddcart_Click(object sender, EventArgs e)
{
    var newItem = new CartItem()
    {
        ID = GetNewID(),  // Implement a method that creates and returns a unique identifier
        Name = textbox_Name.Text,
        Quantity = (int)numericUpDown_Quantity.Value
    };

    cartItems.Add(newItem);
}

您可能需要配置数据网格视图以显示正确的列,您可以在此处查看:https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.datagridview?view=netframework-4.8

【讨论】:

  • ToString() 在 CartItem 中缺失,以便在列表和网格中充分显示。
  • @OlivierRogier 网格显示CartItem 的各个属性,因此不需要ToString() 覆盖。
  • 确实适用于gridview。我的评论中有一个小错误。但是没有 tostring 的列表视图会显示什么?
  • 我被最后一张不包括列表框的截图误导了,但如果 OP 也想使用列表框,覆盖 ToString() 是设置显示文本的好方法一个对象。
  • 最后一个屏幕截图是用于将项目添加到库存/数据库 xml 第三个屏幕截图是用于从库存中获取项目并查看我编辑的帖子的项目请查看
【解决方案2】:

你需要写:

dataGridView2.Rows[idx].Cells["ID"].Value = item.ToString();

假设列表中项目的类型实现了足够的覆盖方法,否则您可以实现它,或者如果您不能,则使用嵌入式值包装器。

由于列表正确显示字符串,它已经完成了。

下面是你想做的可以看看:

using System;
using System.Windows.Forms;

namespace WindowsFormsAppTest
{

  public partial class FormTest : Form
  {

    public FormTest()
    {
      InitializeComponent();
    }
    private void FormTest_Load(object sender, EventArgs e)
    {
      listBox1.Items.Add(new CartItem { ID = 1, Name = "Item 1", Quantity = 10 });
      listBox1.Items.Add(new CartItem { ID = 2, Name = "Item 2", Quantity = 20 });
      listBox1.Items.Add(new CartItem { ID = 3, Name = "Item 3", Quantity = 30 });
      listBox1.Items.Add(new CartItem { ID = 4, Name = "Item 4", Quantity = 40 });
      dataGridView2.AutoGenerateColumns = false;
      dataGridView2.Columns.Add("ID", "ID");
      dataGridView2.Columns.Add("Name", "Name");
      dataGridView2.Columns.Add("Quantity", "Quantity");
    }
    private void ActionAddToCart_Click(object sender, EventArgs e)
    {
      if ( listBox1.SelectedItem != null )
        foreach ( CartItem item in listBox1.SelectedItems )
        {
          int index = dataGridView2.Rows.Add();
          dataGridView2.Rows[index].Cells["ID"].Value = item.ID;
          dataGridView2.Rows[index].Cells["Name"].Value = item.Name;
          dataGridView2.Rows[index].Cells["Quantity"].Value = item.Quantity;
        }
    }
    private void ActionClearCart_Click(object sender, EventArgs e)
    {
      dataGridView2.Rows.Clear();
    }
  }
  public class CartItem
  {
    public int ID { get; set; }
    public string Name { get; set; }
    public int Quantity { get; set; }
    public override string ToString()
    {
      return Name;
    }
  }
}

接下来,如果您想在 List 上使用绑定,则可以使用 @Stefan 答案。

我建议使用带有 BindingSource 的 ADO.NET DataTable 以便能够与 listview 和 datagridview 项目一起正常工作,而不会出现编辑等 UI 和 UX 问题。

【讨论】:

  • InventorySystem.exe 中发生了“System.InvalidCastException”类型的未处理异常附加信息:无法将“System.Data.DataRowView”类型的对象转换为“InventorySystem.CartItem”类型。
  • 如果您现在使用 DataTables,则不需要此答案和 CartItem 显示包装模式。您只需要将 datagridview 和 listview 绑定到数据集中的数据表,就可以了。所以这个答案不再符合原来的问题。我推荐Beginning C# 2005 Databases:这是一本学习 ADO.NET 和绑定的精彩而简单的分步书。
【解决方案3】:
        if (listBoxContacts.SelectedItem != null)
            foreach (string item in listBoxContacts.SelectedItems)
            {
                int A = dataGridView1.Rows.Add();
                // dataGridView1.Rows[index].Cells[textBox1.Text].Value = item;
                dataGridView1.Rows[A].Cells[0].Value = textBox1.Text;
                dataGridView1.Rows[A].Cells[1].Value = textBox3.Text;
                dataGridView1.Rows[A].Cells[2].Value = textBox4.Text;
                dataGridView1.Rows[A].Cells[3].Value = textBox5.Text;
                dataGridView1.Rows[A].Cells[4].Value = textBox6.Text;

            }

【讨论】:

  • 通过解释此代码的作用以及此方法解决操作问题的原因,改进您的仅代码答案。
猜你喜欢
  • 1970-01-01
  • 2013-09-21
  • 1970-01-01
  • 2014-09-14
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多