【问题标题】:How do I put subitems in columns right next to a specific column in Listview?如何将子项放在 Listview 中特定列旁边的列中?
【发布时间】:2019-07-08 04:46:28
【问题描述】:

我对 C# 很陌生,想尝试一些问题。我创建了一个ListView 来存储两个随机数的操作,所有这些操作都发生在一定的时间内。

这是我构建ListView的方法:
第一列称为“开始时间”,用于记录计时器开始的时间。第二列的作用相同,但为“结束时间”。现在,当它运行时,Listview 将以编程方式创建多个列来存储操作结果。
但是,当程序运行时,结果会跳转到保留用于记录“结束时间”的第二列。
如何确保在计时器结束之前第二列是空的并且结果会从第三列开始放到最后吗?

代码如下:

static int k = 10;
ListViewItem lvi1 = new ListViewItem();

private void Bstart_Click(object sender, EventArgs e)
{
    timer1.Start();
    lvi1 = new ListViewItem(DateTime.Now.ToString("HH:mm:ss"));
    listView2.Items.Add(lvi1);
}

private void Timer1_Tick(object sender, EventArgs e)
{
    Random ran1 = new Random();
    Random ran2 = new Random();

    double nu1 = ran1.Next(0, 100);
    double nu2 = ran2.Next(2, 270);

    string op;
    var operation = ran1.Next(1, 5);
    double res;

    if (k > 1)
    {
        label1.Text = k.ToString() + " seconds remaining";
    }
    else if (k == 1)
    {
        label1.Text = k.ToString() + " seconds remaining";
    }
    else
    {
        timer1.Stop();
        lvi1.SubItems[1].Text = DateTime.Now.ToString("HH:mm:ss");
        label1.Text = "You have 10 seconds";
        //MessageBox.Show("You are out of time!", "Too Bad", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation);
        k = 10;
    }

    k--;

    switch (operation)
    {
        case 1:
            res = nu1 + nu2;
            op = "+";
            break;
        case 2:
            res = nu1 - nu2;
            op = "-";
            break;
        case 3:
            res = nu1 * nu2;
            op = "*";
            break;
        case 4:
            res = nu1 / nu2;
            op = "/";
            break;
        default:
            res = 0;
            op = "?";
            break;
    }

    textBox1.Text = Convert.ToString(nu1 + " " + op + " " + nu2 + " = " + res);
    listView2.Columns.Add("OP", 45, HorizontalAlignment.Center);
    lvi1.SubItems.Add(res.ToString());
}

private void Bstop_Click(object sender, EventArgs e)
{
    timer1.Stop();
}

【问题讨论】:

  • 您的if(k > 1)else if (k == 1) 的内容完全相同。您可以将它们合并到if (k >= 1)
  • 我是否正确地假设结果都从您希望它们开始的位置向左移动了一列?他们不是从第三列开始,而是从第二列开始,但其他一切都按预期工作?
  • 是的,其他一切正常。我需要我的结果从第三列开始

标签: c# winforms listview timer


【解决方案1】:

您可以添加一个占位符项以用string.Empty- 填充第二列,直到您想要实际填充它:

private void Bstart_Click(object sender, EventArgs e)
{
    timer1.Start();
    lvi1 = new ListViewItem(DateTime.Now.ToString("HH:mm:ss"));
    listView2.Items.Add(lvi1);

    // Add an empty SubItem or any placeholder here:
    // lvi1.SubItems.Add(string.Empty);
    lvi1.SubItems.Add("-");
}

正如我在评论中已经提到的,您的if(k > 1)else if (k == 1) 具有完全相同的内容。您可以合并这些:

if (k >= 1)
{
    label1.Text = k.ToString() + " seconds remaining";
}
else
{
    timer1.Stop();
    // ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 2014-07-17
    相关资源
    最近更新 更多