Цитата(Partizan @ 23.6.2009, 21:55 ) | | сразу говори чем =) |
мне показалось неудобно работать с ним. компоненту на форму бросать. Попробовал через Thread, сравнил, выбрал второе =)
Помогите разобраться, может кто сталкивался:
| Код | public partial class frmMap : Form { ProgressBar progressBar; // текущий прогресс бар ListBox listBox; // текущий листбокс public delegate void ProgressChanged(int progress); public delegate void ListBoxChanged(List<string> list); public ProgressChanged pc = null; public ListBoxChanged lc = null;
public void SetProgress(int progress) { if (progressBar.InvokeRequired) { ProgressChanged pc = new ProgressChanged(SetProgress); progressBar.Invoke(pc, progress); } else { progressBar.Value = progress; } }
public void SetListBoxDataSource(List<string> list) { if (listBox.InvokeRequired) { ListBoxChanged lc = new ListBoxChanged(SetListBoxDataSource); listBox.Invoke(lc, list); } else { listBox.DataSource = list; } } private void go(object parameters) { pc = SetProgress; lc = SetListBoxDataSource; object[] paramList = (object[])parameters; List<string> list = (List<string>)paramList[0]; int selIdx = (int)paramList[2]; ITable table = (ITable)paramList[1]; IRow row; for (int i = 0; i < table.RowCount(null); i++) { row = table.GetRow(i); list.Add(row.get_Value(selIdx).ToString()); if (pc != null) SetProgress(i); } if (lc != null) SetListBoxDataSource(list); if (pc != null) SetProgress(0); }
private void ComboBox_SelectedIndexChanged(object sender, EventArgs e) { ComboBox cb = (ComboBox)sender; IFeatureLayer featureLayer; string layerName = cb.Name.Substring(2); featureLayer = (IFeatureLayer)axMapControl1.ActiveView.FocusMap.get_Layer(0); for (int i = 0; i < axMapControl1.ActiveView.FocusMap.LayerCount; i++) { featureLayer = (IFeatureLayer)axMapControl1.ActiveView.FocusMap.get_Layer(i); if (featureLayer.FeatureClass.AliasName.ToUpper() == layerName.ToUpper()) break; } ITable table = (ITable)featureLayer; Panel pnl = (Panel)cb.Parent; ListBox lb = (ListBox)pnl.Controls.Find("lb"+featureLayer.FeatureClass.AliasName, false)[0]; list = new List<string>(); int selIdx = cb.SelectedIndex; listBox = lb; // устанавливаем текущий листбокс ProgressBar pb = (ProgressBar)pnl.Controls.Find("pb" + featureLayer.FeatureClass.AliasName, false)[0]; //устанавливаем выбраный прогрес бар object o = new object[] { list, table, selIdx }; progressBar = (ProgressBar)pnl.Controls.Find("pb" + featureLayer.FeatureClass.AliasName, false)[0]; progressBar.Maximum = table.RowCount(null); System.Threading.Thread thread = new System.Threading.Thread(go); thread.Start(o); } }
|
ситуация такая, все работает так как мне нужно, но есть проблема, поскольку контролы созданы динамически, то если я на соседнем комбобоксе изменю индекс, то запускается процесс и он автоматически меняет глобальные листбокс и прогрсбар. и соответственно процедуры SetListBoxDataSource, SetProgress начинают менять состояние других объектов, как бы так извратится, чтоб каждый поток свой прогрессбар менял? |