0

ToolStripMenu と、qcategorychar 型という名前の列があるテーブルがあります。qcategory選択した ToolStripMenuItem と等しい行のみを選択するクエリを作成したいと考えています。だから私はこの方法で試しました:

String categorie;
        private void categoriaBToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            Simulare sim = new Simulare();
            sim.Show();
        }

        public void simulareExamenToolStripMenuItem_Click(object sender, EventArgs e)
        {
           categorie = simulareExamenToolStripMenuItem.Selected.ToString();
        }

        public string getCategorie()
        {
            return categorie;
        }

私がそこで行ったことは、という名前の文字列を作成することでしたcategoriesimulareExamenToolStripMenuItemメニューからのボタンです。categorieここでは、選択したアイテムの文字列値に割り当てます。categoriaBToolStripMenu1インスタンス化されたフォームSimulareでは、クエリはどこにありますか。その後、 の値を返す関数を作成しましたcategorie。次に、Simulareフォームでフォームをインスタンス化しましElevた(メニューはどこですか)。

Elev elev = new Elev();

その後、コンストラクターでfrom formcategorieの値に代入します。categorieElev

String categorie = elev.getCategorie();

クエリを実行します。

String dataA = "SELECT DISTINCT * FROM questions where `qcategory`  = '" + categorie + "' order by rand() limit 1";

私の問題は、メニュー項目の値が正しく読み取られず、問題が見つからないことです。Elev全体として、 form から文字列値を渡して formでcategorie使用する必要がありますSimulare。誰でもそれを手伝ってもらえますか?ありがとう!

アップデート! さて、これはがらくたです。これは私がElevフォームに持っているものです:

public void simulareExamenToolStripMenuItem_Click(object sender, EventArgs e)
        {
           //categorie = simulareExamenToolStripMenuItem.Selected.ToString();
            //SimulatorManager.Categorie = simulareExamenToolStripMenuItem.DropDownItems.ToString();
            foreach (ToolStripMenuItem subItem in simulareExamenToolStripMenuItem.DropDownItems) //dropdown is the name of the **parent** of the dropdown. Without your full code I can't tell you what to put there
                {
                    if(subItem.Checked)
                        {
                            SimulatorManager.Categorie = subItem.Text;
                        }
                }
        }

        private void categoriaBToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            Simulare sim = new Simulare();
            sim.Show();
        }

これは私がSimulareフォームに持っているものです:

String categorie = SimulatorManager.Categorie; 

そしてコンストラクターで:

String dataA = "SELECT DISTINCT * FROM questions where `qcategory`='" + categorie + "' order by rand() limit 1";

しかし、存在する行は表示されずCategoriaB、値が存在する行が表示されますCategoria C。そのConsole.WriteLine(categorie)上に が表示されますがCategoria C、本来あるべきではありませんCategoriaB。(列Categoria Cのような値ですCategoria Bqcategory、他の行にあります。) OMG! Categoria Cどのサブアイテムを選択しても、 ..why???が選択されます。

更新2 これは私がElevフォームに持っているものです:

public void simulareExamenToolStripMenuItem_Click(object sender, EventArgs e)
        {
            foreach (ToolStripMenuItem subItem in simulareExamenToolStripMenuItem.DropDownItems) 
                {
                    if(subItem.Checked)
                        {
                            SimulatorManager.Categorie = subItem.Text;
                        }
                }
        }

        private void categoriaBToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            Simulare sim = new Simulare();
            sim.Show();
        }

        private void categoriaCToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            Simulare sim = new Simulare();
            sim.Show();
        }

これは私がSimulareフォームに持っているものです:

public Simulare() // maine constructor
        {
            String categorie = SimulatorManager.Categorie;
            Console.WriteLine(categorie);
            dataA = "SELECT DISTINCT * FROM questions where `qcategory`='" + categorie + "' order by rand() limit 1";
        }

どのサブアイテムを選択しても、メニューから最後のサブアイテムの文字列値を含む行が選択されます。( Categoria C) をクリックするとCategoria B、 から質問が届きますCategoria C

4

1 に答える 1

2

Selectedプロパティはブール値です。つまり、常にcategorie等しい"True"か、またはになり"False"ます。このリンクを確認してください

考えられる解決策:

public void simulareExamenToolStripMenuItem_Click(object sender, EventArgs e)
{
   ToolStripMenuItem senderMenuItem = sender as ToolStripMenuItem;
   if(senderMenuItem != null)
   {
      categorie = senderMenuItem.Text;
   }
}

これはすべてのメニュー項目で機能します。各メニュー項目のクリック ハンドラーとして追加するだけです。

または:

public void simulareExamenToolStripMenuItem_Click(object sender, EventArgs e)
{
   categorie = "Something";
}

このソリューションでは、各メニュー項目に、これと同様のクリック イベント ハンドラーが必要です。

編集

ドロップダウン メニュー項目がチェックできることを確認する必要があります (これはプロパティで設定されます)。ボタンをクリックすると、ドロップダウン メニューが表示され、選択したメニュー項目が表示されます。

public void simulareExamenToolStripMenuItem_Click(object sender, EventArgs e)
{
   foreach(ToolStripMenuItem subItem in dropdown.DropDownItems) //dropdown is the name of the **parent** of the dropdown. Without your full code I can't tell you what to put there
   {
      if(subItem.Checked)
      {
         categorie = subItem.Text;
      }
   }
}

あなたの質問は何を達成しようとしているのか明確ではないため、完全なコードを投稿することを検討する必要があります。

編集 2

私は自分のプロジェクトを作成して、あなたが達成しようとしていることの完全な解決策を示すことにしました. これは、Windowsがどのように見えるかです

Elev.cs

public partial class Elev : Form
{
    private string category = null;

    public Elev()
    {
        InitializeComponent();
    }

    //Attached to **each** sub item in the dropdown
    private void OnCategoryChecked(object sender, EventArgs e)
    {
        ToolStripMenuItem senderItem = sender as ToolStripMenuItem;

        //If the sender isn't a tool strip item OR it's alreadt checked do nothing
        if (senderItem != null && !senderItem.Checked)
        {
            //Un check the previously checked item
            foreach (ToolStripMenuItem item in this.toolStripDropDownButton1.DropDownItems)
            {
                item.Checked = false;
            }

            //Set it to checked so the user knows which is selected
            senderItem.Checked = true;

            //Set the category
            this.category = senderItem.Text;
        }
    }

    private void ExamineButtonClicked(object sender, EventArgs e)
    {
        if (category == null)
        {
            MessageBox.Show("Select a category first!");
        }
        else
        {
            Simulare sim = new Simulare(this.category);
            sim.Show();
        }
    }
}

Simulare.cs

public partial class Simulare : Form
{
    public Simulare()
    {
        InitializeComponent();
        this.categoryTextBox.Text = "None";
    }

    public Simulare(string category)
    {
        InitializeComponent();
        this.categoryTextBox.Text = category;
    }

    public string Category
    {
        get
        {
            return this.categoryTextBox.Text;
        }
        set
        {
            this.categoryTextBox.Text = value;
        }
    }
}
于 2015-03-17T16:22:11.613 に答える