数据绑定到列表并使用Windows窗体动态添加控件

时间:2012-02-16 15:30:46

标签: c# winforms

我有一个List<Appointment>,其中有一个约会。

public class Appointment
{
    public string Title { get; set; }
    public string Start { get; set; }
    public string End { get; set; }
}

我想在表单上的单独行上动态添加每个列表项,如下所示:

item.Title + " between" + item.Start + " and " + item.End;

我希望能够点击每个项目(文本),然后每次点击它都可以切换红色和黑色之间的文本颜色(也就是说,如果黑色变成红色,如果是红色则变为黑色,当你点击)。

我来自网络背景,但我正在努力使用Windows窗体data binding。我尝试过使用表格布局面板但只是不知道从哪里开始更改单击项目的颜色。

PS:如果有帮助,列表中的项目数可能不会超过10个。

根据Jamie Ide的评论我已经进一步了解:

    var appts = GetAllCalendarItems();
    foreach (var item in appts)
    {
        Label label = new Label();
        label.Text = item.Title + " between" + item.Start + " and " + item.End;
        label.Click += new EventHandler(label_Click);
        flowLayoutPanel1.Controls.Add(label);
    }

...

private void label_Click(object sender, EventArgs e)
{
    // This is wrong - what goes here??
    ((Label)sender).ForeColor = Color.Red;
}

4 个答案:

答案 0 :(得分:2)

动态布局Windows窗体是一个巨大的痛苦。我没有时间对此进行编码,但步骤如下:

  • 将FlowLayoutPanel添加到表单作为容器
  • 查看您的约会并为每个
  • 创建标签控件
  • 将标签控件添加到面板的Controls集合
  • 为每个标签控件分配一个OnClick处理程序以切换颜色

不要为数据绑定而烦恼。


如果您没有更改默认标签的初始颜色,则会切换它:

    private void label1_Click(object sender, EventArgs e)
    {
        var lbl = (Label)sender;
        var toggle = lbl.ForeColor == SystemColors.ControlText;
        lbl.ForeColor = toggle ? Color.Red : SystemColors.ControlText;
    }

答案 1 :(得分:1)

您可以将每个文本字段添加为标签或列表视图项的成员。然后处理“OnClick”或“SelectedIndexChanged”事件。要创建OnClick事件处理程序,请在设计视图中双击控件。像这样编辑处理程序:

 private void listView1_SelectedIndexChanged(object sender, EventArgs e)
    {
        listView1.SelectedItems[0].ForeColor = Color.Red;
    }

如果你不确定事件处理程序,不要推迟它们很容易,或许可以查看它们here。如果列表视图不是您要查找的内容,请在不同的控件上尝试相同的方法。

答案 2 :(得分:1)

我想我无法评论Jamie的答案,但raklos你可以通过编程方式添加OnClick方法:

label.Click += new EventHandler(label_Click);

当您开始输入存根时,Visual Studio应该为您自动生成存根。

这样的事情可以让你开始:

private void label_Click(object sender, EventArgs e) { ToggleTextColor((Label)sender); }

private void ToggleTextColor(Control control)
{
    var currentColor = control.ForeColor;
    control.ForeColor = currentColor == Color.Red ? Color.Black : Color.Red;
}

答案 3 :(得分:0)

您可以在WebBrowserControl中作弊并创建它。 你会熟悉的。 使用ObjectforScripting for WeBbrowser&lt; =&gt; winforms沟通。

http://msdn.microsoft.com/en-us/library/system.windows.forms.webbrowser.objectforscripting.aspx