У меня есть форма, которая содержит элемент управления списком со многими другими элементами управления, которые определяют содержимое списка. Добавление элементов в список правильно задает диапазон полосы прокрутки, но обновление элементов в списке (через this.lstResources.Items [index] = myUri) приводит к тому, что диапазон полосы прокрутки уменьшается за наибольшую ширину элемента, отсекая последние несколько символов. Полоса прокрутки по-прежнему работает, но обновление списка таким образом вызывает неожиданный и неприемлемый диапазон прокрутки для элементов (ов) в списке. Вот как я реализую мой ListBox:Listbox horizontal scrollbar не обновляется должным образом
public System.Windows.Forms.ListBox lstResources;
this.lstResources = new System.Windows.Forms.ListBox();
this.lstResources.FormattingEnabled = true;
this.lstResources.HorizontalScrollbar = true;
this.lstResources.Location = new System.Drawing.Point(331, 122);
this.lstResources.Name = "lstResources";
this.lstResources.Size = new System.Drawing.Size(307, 316);
this.lstResources.TabIndex = 8;
this.lstResources.Click += new System.EventHandler(this.ResourcesPage.LstResources_Click);
Операции изменяющие, которые я выполнять на этом ListBox следующим образом:
this.parentClassReference.lstResources.Items.Add(myUri);
this.parentClassReference.lstResources.Items[index] = myUri;
this.parentClassReference.lstResources.Items.RemoveAt(index);
Я попытался Refresh() и Update() как на форме и элемент управления списком, но не имеет никакого эффекта. Я рассмотрел все проблемы с прокруткой списка, но ни одна из них не имеет этой специфической проблемы перерисовки.
Это то, что он должен выглядеть следующим образом:
Это то, что на самом деле происходит:
У меня есть чувство, что я отсутствующий что-то очевидное, или, возможно, изменяя элементы неправильно, но я свеж от идей для этого. Я не совсем новичок в дизайне C# и UI, но я не могу сказать, что я знаю все операции с жестким контролем. Любая помощь будет высоко оценена.
EDIT 1: Это образец, который должен воспроизводить проблему. Я начинаю есть подозрение, что StringBuilder может иметь что-то делать с частью обновления, но он также используется в коде btnAdd_Click, а ...
public partial class SampleListBoxForm : Form
{
public Dictionary<string, string> CurrentUriQuery { get; set; }
public SampleListBoxForm()
{
this.CurrentUriQuery = new Dictionary<string, string>();
this.InitializeComponent();
}
private void btnAdd_Click(object sender, EventArgs e)
{
this.UpdateParams("sampleApp");
this.listBox1.Items.Add(this.GenerateURI());
this.listBox1.Refresh();
}
private void btnUpdate_Click(object sender, EventArgs e)
{
int index = 0;
this.UpdateParams("sampleApp2");
for (; index < this.listBox1.Items.Count; index++)
{
this.listBox1.Items[index] = this.GenerateURI();
}
}
private void UpdateParams(string filename)
{
this.CurrentUriQuery = new Dictionary<string, string>();
this.CurrentUriQuery["filename"] = filename;
this.CurrentUriQuery["url"] = @"C:\Users\me\Desktop\" + filename;
this.CurrentUriQuery["type"] = "dynamicType";
this.CurrentUriQuery["p1"] = "foo";
this.CurrentUriQuery["p2"] = "bar";
this.CurrentUriQuery["p3"] = "stuff";
this.CurrentUriQuery["p4"] = "test";
}
private string GenerateURI()
{
StringBuilder currentUri = new StringBuilder();
bool firstParam = true;
currentUri.Append(this.CurrentUriQuery["filename"]);
foreach (KeyValuePair<string, string> pair in this.CurrentUriQuery)
{
if (pair.Key != "url" && pair.Key != "filename" && pair.Value != string.Empty && pair.Value != "0")
{
if (firstParam)
{
currentUri.Append("?");
firstParam = false;
}
else
{
currentUri.Append("&");
}
currentUri.Append(pair.Key);
currentUri.Append("=");
currentUri.Append(pair.Value.Replace(" ", ""));
}
}
return currentUri.ToString();
}
public string[] ExtractPathAndQueryFromUriString(string uriString)
{
string[] pathAndQuery = new string[2];
if (uriString.Contains('?'))
{
pathAndQuery[0] = uriString.Split('?')[0];
pathAndQuery[1] = uriString.Split('?')[1];
}
else if (uriString.Contains("%3F"))
{
string[] stringSeparator = new string[] { "%3F" };
pathAndQuery[0] = uriString.Split(stringSeparator, StringSplitOptions.None)[0];
pathAndQuery[1] = uriString.Split(stringSeparator, StringSplitOptions.None)[1];
}
else
{
pathAndQuery[0] = uriString;
pathAndQuery[1] = string.Empty;
}
return pathAndQuery;
}
}
Не удается воспроизвести. Изменение элемента ListBox изменяет диапазон полос прокрутки. – LarsTech
Есть ли способ отслеживать диапазон полос прокрутки, чтобы я мог сам его отлаживать? Возможно, это непубличная собственность? Я бы предоставил больше кода, но я не думаю, что остальное релевантно. Я просматриваю каждый элемент списка, чтобы обновить их, но это касается объема соответствующего внешнего кода. Редактировать: Это может помочь узнать, что эти операции не выполняются в том же объекте, что и в списке, поэтому он является общедоступным. – covertCoder
Сделайте это наоборот. Создайте новый проект и воспроизведите проблему с минимальным количеством кода. Отправьте этот код.Вы смотрите на код, который никто больше не видит, что затрудняет помощь. – LarsTech