Как заставить Winforms ToolStripSplitButton запомнить последнюю нажатую кнопку? - PullRequest
1 голос
/ 03 августа 2011

Я пытаюсь использовать ToolStripSplitButton для «экспорта» части моего пользовательского интерфейса, т.е.

Экспорт в PDF ...

Экспорт в XLS ...

Экспорт в CSV ...

При запуске по умолчанию следует использовать «Экспорт в PDF ...» и показывать все возможные настройки, когда пользователь нажимает стрелку раскрывающегося списка.

Если пользователь выбирает другой параметр экспорта, он должен «запомнить» этот параметр и показать его в качестве значения по умолчанию.

Редактировать Например, если пользователь выбирает «Экспорт в XLS ...» из раскрывающегося списка - «Экспорт в XLS ...» заменит «Экспорт в PDF ...» в качестве текста в главной кнопке, и теперь они могут нажать на нее, чтобы создать файлы XLS вместо использования раскрывающегося списка.

Стандартная панель инструментов Visual Studio 2008 имеет 2 элемента управления, которые ведут себя так, как я хочу. Первый показывает «Новый проект ...» (в виде значка, а не текста), но если вы выберете «Новый веб-сайт ...» из раскрывающегося списка, это станет значением по умолчанию. \ Edit

Я думал, что ToolStripSplitButton сделает все это автоматически, но этого не происходит, а раздел справки почти бесполезен.

Кто-нибудь может привести пример, как это сделать?

Ответы [ 2 ]

1 голос
/ 03 августа 2011

Мне кажется, я знаю, что вы пытаетесь сделать.

Я создал переменную Settings под названием LastExportButton из окна свойств.

И вот несколько кодов, которые я создал вместе, которые "запоминают"последняя кнопка "выбрана":

private void Form1_Load(object sender, EventArgs e)
{
  string lastButton = Properties.Settings.Default.LastExportButton;
  if (ExportSplitButton.DropDownItems.ContainsKey(lastButton))
  {
    if (lastButton == ExportPDFButton.Name)
      ExportSplitButton.DefaultItem = ExportPDFButton;
    else if (lastButton == ExportXLSButton.Name)
      ExportSplitButton.DefaultItem = ExportXLSButton;
    else if (lastButton == ExportCSVButton.Name)
      ExportSplitButton.DefaultItem = ExportCSVButton;

    ExportSplitButton.Text = ExportSplitButton.DefaultItem.Text;
  }
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
  Properties.Settings.Default.LastExportButton = ExportSplitButton.DefaultItem.Name;
  Properties.Settings.Default.Save();
}

private void ExportSplitButton_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
  ((ToolStripSplitButton)sender).DefaultItem = e.ClickedItem;
  ((ToolStripSplitButton)sender).Text = e.ClickedItem.Text;
}
1 голос
/ 03 августа 2011

Было бы неплохо, если бы ToolStripItems мог отображать переключатель. У них нет, у них есть только опция для галочки. Что хорошо, но все же делает очевидным для пользователя, что использовалось в последний раз. Вы можете смоделировать переключатель с изображением, если хотите. Anyhoo, код будет похож на это:

    private void oneToolStripMenuItem_Click(object sender, EventArgs e) {
        // stuff
        //..
        setCheck((ToolStripMenuItem)sender);
    }
    private void twoToolStripMenuItem_Click(object sender, EventArgs e) {
        // stuff
        //..
        setCheck((ToolStripMenuItem)sender);
    }
    // Add more as needed
    //...

    private void setCheck(ToolStripMenuItem check) {
        foreach (ToolStripMenuItem item in toolStripSplitButton1.DropDown.Items) {
            item.Checked = item == check;
        }
    }

Вполне вероятно, что в этом случае вам не нужны отдельные обработчики событий Click, это может сделать один метод. Вы используете аргумент sender , чтобы узнать, по какому элементу была нажата кнопка.

...