Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何让Winforms ToolStripSplitButton记住上次单击的按钮?_Winforms_Visual Studio 2008_Toolstrip - Fatal编程技术网

如何让Winforms ToolStripSplitButton记住上次单击的按钮?

如何让Winforms ToolStripSplitButton记住上次单击的按钮?,winforms,visual-studio-2008,toolstrip,Winforms,Visual Studio 2008,Toolstrip,我正在尝试使用ToolStripSplitButton作为UI的“导出”部分,即 导出为PDF 导出到XLS 导出到CSV 启动时,它应该默认为“导出为PDF…”,并在用户单击下拉箭头时显示所有可能的设置 如果用户选择其他导出设置,则应“记住”该设置,并将其显示为默认设置 编辑例如,如果用户从下拉列表中选择“导出到XLS…”,则“导出到XLS…”将替换“导出到PDF…”作为主按钮中的文本,他们现在可以单击该按钮来创建XLS文件,而不是使用下拉列表 VisualStudio2008“标准”工具栏有

我正在尝试使用ToolStripSplitButton作为UI的“导出”部分,即

导出为PDF

导出到XLS

导出到CSV

启动时,它应该默认为“导出为PDF…”,并在用户单击下拉箭头时显示所有可能的设置

如果用户选择其他导出设置,则应“记住”该设置,并将其显示为默认设置

编辑例如,如果用户从下拉列表中选择“导出到XLS…”,则“导出到XLS…”将替换“导出到PDF…”作为主按钮中的文本,他们现在可以单击该按钮来创建XLS文件,而不是使用下拉列表

VisualStudio2008“标准”工具栏有两个控件,它们的行为符合我的要求。第一个显示“新建项目…”(作为图标,而不是文本),但如果您从下拉列表中选择“新建网站…”,这将成为默认设置\Edit

我原以为ToolStripSplitButton会自动完成所有这一切,但事实并非如此,帮助主题几乎毫无用处


有人能举个例子说明如何做到这一点吗?

如果ToolStripItems可以显示单选按钮就好了。他们没有,他们只有一个复选标记选项。这是很好的说法,但还是有点让用户知道上次使用的是什么。如果愿意,可以用图像模拟单选按钮。总之,代码与此类似:

    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;
        }
    }

很可能您不需要单独的单击事件处理程序,在这种情况下,一个方法就可以做到这一点。您可以使用sender参数来确定单击了哪个项目。

我想我知道您想做什么

我从Properties窗口创建了一个名为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;
}