0

上部で実行しているユーザー コントロール コードで:

int counter;

コンストラクターで:

counter = 0;

MouseDown イベントでは、次のことを行っています。

private void listBox1_MouseDown(object sender, MouseEventArgs e)
        {
            int index = listBox1.IndexFromPoint(e.X, e.Y);

            if (e.Button == System.Windows.Forms.MouseButtons.Right)
            {
                if (m_itemIndexes.Contains(index))
                    return;

                m_itemIndexes.Add(index);
                DrawItem(index);
                counter += 1;
            }

カウンター += 1; でブレークポイントを使用しました。マウスの右ボタンをクリックするたびに 1 つずつ大きくなっていることがわかりました。

次に、カウンターのプロパティを下部に追加します。

[Browsable(true)]
        public int RedCounts
        {
            get { return counter; }
            set
            {
                counter = value;
                Refresh();
            }
        }

次に、上部の Form1 で次のことを行いました。

ListBoxControl lb1;

コンストラクターで:

lb1 = new ListBoxControl();

次に、Form1 の下部に追加しました:

private void deleteSelectedLightningsToolStripMenuItem_Click(object sender, EventArgs e)
            {
                if (MessageBox.Show("Are you Sure you want to delete " + lb1.RedCounts + " the selected files ? Click Yes to Confirm and No to continue", "WinForm", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
                {

                }
                else
                {

                }
            }

しかし、RedCounts の結果は常に 0 で、理由はわかりません。

編集:

counter = 0; の代わりに私がやっていることがわかりました。カウンター = 1 を実行します。そしてカウンターの代わりに += 1; RedCounts += 1 を実行します。次に、RedCounts でブレークポイントを使用すると、カウンターが 1 から 1 ずつ増加していることがわかります。1,2,3,4....

ブレークポイントを使用して deleteSelectedLightningsToolStripMenuItem_Click をクリックすると、何らかの理由で問題が Form1 にあり、lb1.RedCounts は何らかの理由で 1 の値をプロパティまたは行カウンター = 1 から取得しています。なぜかわからない。したがって、カウンターを 121 に設定すると、次に、lb1.RedCounts は 121 を表示します。奇妙なことです。

これは、カウンターと RedCounts を含む完全なユーザー コントロールです。

/*----------------------------------------------------------------
 * Module Name  : ListBoxControl
 * Description  : Change listBox items color
 * Author       : Danny
 * Date         : 30/12/2012
 * Revision     : 1.00
 * --------------------------------------------------------------*/

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;

/*
 *  Introduction :
 * 
 *  By default the color is red.
 *  Added a property to change the color.
 *  Right mouse click on item to change item color.
 *  Left mouse click on item to change the item color back.
 *  If the listBox is empty the control will be filled with 10 "Test" items.
 * */

namespace Lightnings_Extractor // to check how and change the namespace to listBoxControl
{
    public partial class ListBoxControl : UserControl
    {
        private Color m_MyListColor;
        private List<int> m_itemIndexes = new List<int>();
        private List<int> m_coloringItemIndexes = new List<int>();
        private int counter;
        public event EventHandler<ItemEventArgs> ItemRemoved;

        public List<int> Indices
        {
            get { return m_itemIndexes; }
        }

        public ListBoxControl()
        {
            InitializeComponent();

            counter = 1;
            if (listBox1.Items.Count == 0)
            {
                for (int i = 0; i < 10; i++)
                {
                    listBox1.Items.Add("Test " + i);
                }
            }
        }

        private void listBox1_MouseDown(object sender, MouseEventArgs e)
        {
            int index = listBox1.IndexFromPoint(e.X, e.Y);

            if (e.Button == System.Windows.Forms.MouseButtons.Right)
            {
                if (m_itemIndexes.Contains(index))
                    return;

                m_itemIndexes.Add(index);
                DrawItem(index);
                RedCounts += 1;
            }
            else if (e.Button == MouseButtons.Left)
            {
                if (!m_itemIndexes.Contains(index))
                    return;

                m_itemIndexes.Remove(index);
                DrawItem(index);
                OnItemRemoved(index, listBox1.Items[index].ToString());
            }  
            listBox1.SelectedIndex = index;
        }

        protected virtual void OnItemRemoved(int indx, string name)
        {
            EventHandler<ItemEventArgs> handler = ItemRemoved;

            if(handler != null)
                ItemRemoved(this, new ItemEventArgs() {  Index = indx, Name = name});
        }

        private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
        {
            m_MyListColor = MyListColor;
            if (m_MyListColor.IsEmpty == true)
            {
                m_MyListColor = Color.Red;
            }

            bool selected = (e.State & DrawItemState.Selected) == DrawItemState.Selected;

            if (m_itemIndexes.Contains(e.Index))
            {
                using (var brush = new SolidBrush(m_MyListColor))
                {
                    e.Graphics.FillRectangle(brush, e.Bounds);
                }
            }
            else
            {
                e.DrawBackground();
            }

            string item = listBox1.Items[e.Index].ToString();
            e.Graphics.DrawString(item, e.Font, selected || m_itemIndexes.Contains(e.Index) ? Brushes.White : Brushes.Black, e.Bounds, StringFormat.GenericDefault);

            if (selected)
                e.DrawFocusRectangle();
        }

        private void DrawItem(int index)
        {
            Rectangle rectItem = listBox1.GetItemRectangle(index);
            listBox1.Invalidate(rectItem);
        }

        [Browsable(true)]
        public Color MyListColor
        {
            get { return m_MyListColor; }
            set
            {
                m_MyListColor = value;
                Refresh();
            }
        }

        [Browsable(true)]
        public ListBox MyListBox
        {
            get { return listBox1; }
            set
            {
                listBox1 = value;
                Refresh();
            }
        }

        [Browsable(true)]
        public int RedCounts
        {
            get { return counter; }
            set
            {
                counter = value;
                Refresh();
            }
        }

        private void ListBoxControl_Load(object sender, EventArgs e)
        {
            this.listBox1.SelectedIndex = 0;
        }
    }

    public class ItemEventArgs : EventArgs
    {
        public int Index { get; set; }
        public string Name { get; set; }
    }
}
4

2 に答える 2

2

奇跡はありませんcounter。コードのどこかを右クリックします->「すべての参照を検索」。0 で初期化した結果がすぐに表示されない場合は、発生するたびにブレーク ポイントを設定すると、すぐに見つかります。

于 2013-01-02T12:12:36.270 に答える
-4

クラスが呼び出されるたびにすべての非静的オブジェクトが再度インスタンス化されるため、カウンター変数は常にゼロです。`static int counter = 0;のように、カウンター変数を静的として宣言する必要があります。

`

于 2013-01-02T11:59:22.237 に答える