示例#1
0
        private static void UpdateItemFn(object state)
        {
            LviUpdInfo lui = (state as LviUpdInfo);

            if (lui == null)
            {
                Debug.Assert(false); return;
            }

            try             // Avoid cross-thread exceptions
            {
                bool bWork;
                lock (lui.ValidIDsSyncObject)
                {
                    if (!lui.ValidIDs.TryGetValue(lui.UpdateID,
                                                  out bWork))
                    {
                        Debug.Assert(false); return;
                    }
                }

                if (bWork)
                {
                    string strNew = lui.Function(lui.Text, lui.ListItem);
                    if (strNew == null)
                    {
                        Debug.Assert(false); return;
                    }
                    if (strNew == lui.Text)
                    {
                        return;
                    }

                    // if(lui.ListView.InvokeRequired)
                    lui.ListView.Invoke(new SetItemTextDelegate(
                                            SetItemText), new object[] { strNew, lui });
                    // else SetItemText(strNew, lui);
                }
            }
            catch (Exception) { Debug.Assert(false); }
            finally
            {
                try                 // Avoid cross-thread exceptions
                {
                    lock (lui.ValidIDsSyncObject)
                    {
                        if (!lui.ValidIDs.Remove(lui.UpdateID))
                        {
                            Debug.Assert(false);
                        }
                    }
                }
                catch (Exception) { Debug.Assert(false); }
            }
        }
示例#2
0
        public void Queue(string strText, PwListItem li, int iIndexHint,
                          int iSubItem, PwTextUpdateDelegate f)
        {
            if (strText == null)
            {
                Debug.Assert(false); return;
            }
            if (li == null)
            {
                Debug.Assert(false); return;
            }
            if (iSubItem < 0)
            {
                Debug.Assert(false); return;
            }
            if (f == null)
            {
                Debug.Assert(false); return;
            }

            LviUpdInfo state = new LviUpdInfo();

            state.ListView           = m_lv;
            state.UpdateID           = unchecked ((li.ListViewItemID << 6) + iSubItem);
            state.Text               = strText;
            state.ListItem           = li;
            state.IndexHint          = ((iIndexHint >= 0) ? iIndexHint : 0);
            state.SubItem            = iSubItem;
            state.Function           = f;
            state.ListEditSyncObject = m_objListEditSync;
            state.ValidIDsSyncObject = m_objValidIDsSync;
            state.ValidIDs           = m_dValidIDs;

            lock (m_objValidIDsSync)
            {
                Debug.Assert(!m_dValidIDs.ContainsKey(state.UpdateID));
                m_dValidIDs[state.UpdateID] = true;
            }

            try
            {
                if (!ThreadPool.QueueUserWorkItem(new WaitCallback(UpdateItemFn),
                                                  state))
                {
                    throw new InvalidOperationException();
                }
            }
            catch (Exception)
            {
                Debug.Assert(false);
                lock (m_objValidIDsSync) { m_dValidIDs.Remove(state.UpdateID); }
            }
        }
示例#3
0
        private static void SetItemText(string strText, LviUpdInfo lui)
        {
            try             // Avoid cross-thread exceptions
            {
                long lTargetID  = lui.ListItem.ListViewItemID;
                int  iIndexHint = lui.IndexHint;

                lock (lui.ListEditSyncObject)
                {
                    ListView.ListViewItemCollection lvic = lui.ListView.Items;
                    int nCount = lvic.Count;

                    // for(int i = 0; i < nCount; ++i)
                    for (int i = nCount; i > 0; --i)
                    {
                        int          j   = ((iIndexHint + i) % nCount);
                        ListViewItem lvi = lvic[j];

                        PwListItem li = (lvi.Tag as PwListItem);
                        if (li == null)
                        {
                            Debug.Assert(false); continue;
                        }

                        if (li.ListViewItemID != lTargetID)
                        {
                            continue;
                        }

                        lvi.SubItems[lui.SubItem].Text = strText;
                        break;
                    }
                }
            }
            catch (Exception) { Debug.Assert(false); }
        }
		private static void SetItemText(string strText, LviUpdInfo lui)
		{
			try // Avoid cross-thread exceptions
			{
				long lTargetID = lui.ListItem.ListViewItemID;
				int iIndexHint = lui.IndexHint;

				lock(lui.ListEditSyncObject)
				{
					ListView.ListViewItemCollection lvic = lui.ListView.Items;
					int nCount = lvic.Count;

					// for(int i = 0; i < nCount; ++i)
					for(int i = nCount; i > 0; --i)
					{
						int j = ((iIndexHint + i) % nCount);
						ListViewItem lvi = lvic[j];

						PwListItem li = (lvi.Tag as PwListItem);
						if(li == null) { Debug.Assert(false); continue; }

						if(li.ListViewItemID != lTargetID) continue;

						lvi.SubItems[lui.SubItem].Text = strText;
						break;
					}
				}
			}
			catch(Exception) { Debug.Assert(false); }
		}
		public void Queue(string strText, PwListItem li, int iIndexHint,
			int iSubItem, PwTextUpdateDelegate f)
		{
			if(strText == null) { Debug.Assert(false); return; }
			if(li == null) { Debug.Assert(false); return; }
			if(iSubItem < 0) { Debug.Assert(false); return; }
			if(f == null) { Debug.Assert(false); return; }

			LviUpdInfo state = new LviUpdInfo();
			state.ListView = m_lv;
			state.UpdateID = unchecked((li.ListViewItemID << 6) + iSubItem);
			state.Text = strText;
			state.ListItem = li;
			state.IndexHint = ((iIndexHint >= 0) ? iIndexHint : 0);
			state.SubItem = iSubItem;
			state.Function = f;
			state.ListEditSyncObject = m_objListEditSync;
			state.ValidIDsSyncObject = m_objValidIDsSync;
			state.ValidIDs = m_dValidIDs;

			lock(m_objValidIDsSync)
			{
				Debug.Assert(!m_dValidIDs.ContainsKey(state.UpdateID));
				m_dValidIDs[state.UpdateID] = true;
			}

			try
			{
				if(!ThreadPool.QueueUserWorkItem(new WaitCallback(UpdateItemFn),
					state)) throw new InvalidOperationException();
			}
			catch(Exception)
			{
				Debug.Assert(false);
				lock(m_objValidIDsSync) { m_dValidIDs.Remove(state.UpdateID); }
			}
		}