Я использую среду IDE VS2017, а также фреймворки 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? Заранее спасибо!
Попробуйте использовать int.Parse((e.Value as IStatus).Value.ToString(), NumberStyles.Any) в своем обработчике событий.
По-прежнему не работает, даже если e.Value = 0. похоже, что проблема не здесь.
Вам не нужно создавать новый ToolStripProgressBar. Используйте его базовый ProgressBar для привязки данных.





ToolStripProgressBar имеет свойство ProgessBar, которое предоставляет элемент управления ProgressBar, размещенный в ToolStripControlHost. Свойства Maximum, Minimum и ValueToolStripProgressBar в основном получают или устанавливают соответствующее свойство нижележащего 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));
}
Хорошо написанный первый вопрос. Отличная работа!