C# 数据绑定can';按IBindableComponent设置的t CONVERT

C# 数据绑定can';按IBindableComponent设置的t CONVERT,c#,.net,winforms,C#,.net,Winforms,我使用的是VS2017 IDE、DotNet4.5.2和WinForm框架 我想用进度条显示一个值,所以我编写了以下代码,它可以正常工作: progressBar1.DataBindings.Add(nameof(ProgressBar.Maximum), source, nameof(source.Maximum)); progressBar1.DataBindings.Add(nameof(ProgressBar.Minimum), source, nameof(source.Minimum

我使用的是VS2017 IDE、DotNet4.5.2和WinForm框架

我想用进度条显示一个值,所以我编写了以下代码,它可以正常工作:

progressBar1.DataBindings.Add(nameof(ProgressBar.Maximum), source, nameof(source.Maximum));
progressBar1.DataBindings.Add(nameof(ProgressBar.Minimum), source, nameof(source.Minimum));
progressBar1.DataBindings.Add(nameof(ProgressBar.Value), source, nameof(source.Status)).Format += (sender,e) => {
    e.Value = (int)(e.Value as IStatus).Value;
};
我想使用ToolStripProgressBar来显示它,但由于它无法执行数据绑定,我定义了一个新类来继承它并实现IBindableComponent,如下所示:

public class BindableToolStripProgressBar : ToolStripProgressBar, IBindableComponent
{
    private BindingContext bindingContext;
    private ControlBindingsCollection dataBindings;

    public BindingContext BindingContext
    {
        get
        {
            if (bindingContext == null)
            {
                bindingContext = new BindingContext();
            }
            return bindingContext;
        }
        set
        {
            bindingContext = value;
        }
    }

    public ControlBindingsCollection DataBindings
    {
        get
        {
            if (dataBindings == null)
            {
                dataBindings = new ControlBindingsCollection(this);
            }
            return dataBindings;
        }
    }
}
然后,我将数据绑定对象从ProgressBar更改为新定义的BindableToolStripProgressBar,但这次运行应用程序导致抛出System.FormatException:

tspb.DataBindings.Add(nameof(ProgressBar.Maximum), source, nameof(source.Maximum));
tspb.DataBindings.Add(nameof(ProgressBar.Minimum), source, nameof(source.Minimum));
tspb.DataBindings.Add(nameof(ProgressBar.Value), source, nameof(source.Status)).Format += (sender, e) => {
    e.Value = (int)(e.Value as IStatus).Value; // Will be thrown FormatException
};
我的IBindableComponent实现有什么问题吗?
谢谢你

ToolStripProgressBar
具有一个属性,该属性公开托管在
ToolStripControlHost
中的
ProgressBar
控件<代码>ToolStripProgressBar的最大值、
最小值
属性基本上获取或设置底层
ProgressBar
的相应属性

因此,您可以设置数据绑定到底层的
ProgressBar

Source source = new Source() { Minimum = 0, Maximum = 100, Value = 50 };
private void Form1_Load(object sender, EventArgs e)
{
    var p = toolStripProgressBar1.ProgressBar;
    p.DataBindings.Add(nameof(p.Maximum), source, nameof(source.Maximum));
    p.DataBindings.Add(nameof(p.Minimum), source, nameof(source.Minimum));
    p.DataBindings.Add(nameof(p.Value), source, nameof(source.Value));
}

第一个问题写得很好。做得好!尝试在事件处理程序中使用
int.Parse((e.Value作为IStatus).Value.ToString(),NumberStyles.Any)
。即使e.Value=0,仍然不起作用。问题似乎不在这里。您不需要创建新的
ToolStripProgressBar
。使用其底层的
ProgressBar
进行数据绑定。