繁体   English   中英

填充列表视图控件将参数从另一个表单传递给构造函数

[英]Populating listview control passing parameters to constructor from another form

我需要在 Takenshows.cs 表单上填充一个 listview 控件,将参数从 Main.cs 表单传递给构造函数。

当我运行代码时,列表视图是空的。 我不知道我的代码有什么问题。

这是我向 Takenshows.cs 表单发送参数时按钮上的 main.cs 表单:

shows = new Takenshows(Ordnumber,meddt, values, 
   num);

这是 Takenshows.cs 表单:

      int Ordnum;
      string medDateTime;
      string val;
      int number;
          public Takenshows()
             {
                InitializeComponent();
               }

          public Takenshows(int Ordnumber, string 
                  dtmed, string values, int num)
               {
        
                  Ordnum = Ordnumber;
                  medDateTime = dtmed;
                  val = values;
                  number = num;
                  InitializeComponent();
               }

我知道问题出在 Takenshows_load 上,但我不知道为什么 listview 没有填满。

     private void Takenshows_Load(object sender, EventArgs e)
        {


             for(int i=0; i< listView1.Items.Count; i++){
                         
                         listView1.Items[i].SubItems[0].Text = Ordnum.ToString();
                         listView1.Items[i].SubItems[1].Text = medDateTime;
                         listView1.Items[i].SubItems[2].Text = val;
                         listView1.Items[i].SubItems[3].Text = number.ToString();

                         ListViewItem item = new ListViewItem(listView1.Items[i].SubItems[0].Text); 
                         item.SubItems.Add(listView1.Items[i].SubItems[1].Text);
                         item.SubItems.Add(listView1.Items[i].SubItems[2].Text);        
                         item.SubItems.Add(listView1.Items[i].SubItems[3].Text);
                         listView1.Items.Add(item);
                     } 



                             }

        private void listView1_SelectedIndexChanged(object sender, EventArgs e)
         {

                }

我能做些什么来解决这个问题?

可以肯定的是这是 Main.cs 形式:

 public partial class Main : Form
{
           int Ordnumber;
           string meddt;
           string values;
           int num;
           TakenShows shows;

     public Main()
           {
        InitializeComponent();
             }

      private void button2_Click(object sender, EventArgs e)
            {
        Ordnumber = GetOrdNumberLN.getInstance().GettingOrdNumber();
        Ordnumber = Ordnumber + 1;
        meddt = DateTime.Now.ToString();
        num = GetNumberLN.getInstance().GettingNumber();
        values = textBox_F.Text + " " + textBox_PT.Text + " " + textBox_QT.Text 
        shows = new Takenshows(Ordnumber,meddt, values, 
   num);
        shows.Show();


          }
  

您需要将创建的数据保存在某些收集容器中,例如DataTableList<T>以便能够设置/获取/操作收集的项目。 这是一个List<T>实现示例。

  • 切换到您的项目的解决方案资源管理器 window 和 select。
  • Shift + Alt + C打开“添加新项目”对话框。
  • 将 class 重命名为ShowItem.cs并点击添加按钮。

编辑 class 如下:

public class ShowItem
{
    public ShowItem() { }

    // Find better names...
    public int Number { get; set; }
    public int OrderNumber { get; set; }
    public DateTime MedDate { get; set; }
    public string F { get; set; }
    public string PT { get; set; }
    public string QT { get; set; }
    public string Values => $"{F} {PT} {QT}";
}

现在您有了ShowItem类型,可以从中创建实例并将它们保存在List<ShowItem>中。

如果要显示模式对话框,请按如下方式编辑Main窗体:

// +
using System.Collections.Generic;
// ...

public partial class Main : Form
{
    private readonly List<ShowItem> showItems;

    public Main()
    {
        InitializeComponent();
        showItems = new List<ShowItem>();
    }

    // Find a better name...
    private void button2_Click(object sender, EventArgs e)
    {
        var show = new ShowItem
        {
            OrderNumber = GetOrdNumberLN.getInstance().GettingOrdNumber() + 1,
            MedDate = DateTime.Now,
            Number = GetNumberLN.getInstance().GettingNumber(),
            F = textBox_F.Text,
            PT = textBox_PT.Text,
            QT = textBox_QT.Text
        };

        showItems.Add(show);

        using (var frm = new FrmShows(showItems))
        {
            frm.ShowDialog();
        }
    }
}

...和Takenshows表格:

// +
using System.Linq;
// ...

public partial class Takenshows : Form
{
    public Takenshows()
    {
        InitializeComponent();
    }

    public Takenshows(IEnumerable<ShowItem> items) : this()
    {
        AddItems(items);
    }

    internal void AddItem(ShowItem item) => AddItems(new[] { item });

    internal void AddItems(IEnumerable<ShowItem> items)
    {
        var lvis = items.Select(x => new ListViewItem(new[]
        {
            x.OrderNumber.ToString(),
            x.MedDate.ToString(),
            x.Values,
            x.Number.ToString()
        }));
        listView1.Items.AddRange(lvis.ToArray());
    }
}

相反,如果您需要保持Takenshows表单打开,则在Main中编辑button2_Click事件处理程序,如下所示。 请注意, AddItemAddItems方法的访问修饰符在此方案中是internal的。

private void button2_Click(object sender, EventArgs e)
{
    var show = new ShowItem
    {
        OrderNumber = GetOrdNumberLN.getInstance().GettingOrdNumber() + 1,
        MedDate = DateTime.Now,
        Number = GetNumberLN.getInstance().GettingNumber(),
        F = textBox_F.Text,
        PT = textBox_PT.Text,
        QT = textBox_QT.Text
    };

    showItems.Add(show);

    var frm = Application.OpenForms.OfType<FrmShows>().FirstOrDefault();

    if (frm == null)
    {
        frm = new FrmShows(showItems);
        frm.Show();
    }
    else
    {
        frm.AddItem(show);
        frm.Activate();
    }            
}

希望这可以帮助您起飞。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM