【问题标题】:Creating tooltip for multiple buttons为多个按钮创建工具提示
【发布时间】:2012-03-13 12:27:39
【问题描述】:

此代码(如下)假设将信息添加到从数据库中获取的工具提示(并且 Codons 类会执行此操作(它是实际工作的部分))。我尝试在 FOR 循环中执行此操作,但它警告我这一行:

toolTip1.SetToolTip(Convert.ToString(letter),"Name: "+fullname+" ("+cdn.GetCodon1()+")"
                          +"\n Begin: "+cdn.GetStart()+", End: "+cdn.GetEnd()+"");

我有 20 个以 a-z 字母命名的按钮,但 6 个特定字母除外(请参阅 FOR 内的 IF)

这是代码:

private void UpdateToolTipButton()
{
  string fullname;
  Codons cdn;
  char letter='a';
  //get info about every amino acid from database
  OleDbConnection  dataConnection = new OleDbConnection();
  dataConnection.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Projects_2012\\Project_Noam\\Access\\myProject.accdb";
  dataConnection.Open();
  for(int i=1;i<=26;i++,letter++)
  {
    if((letter!='b')&&(letter!='e' )&& (letter!='j') && (letter!='o')&& (letter!='u') && (letter!='z'))
    {
      OleDbCommand datacommand = new OleDbCommand();
      datacommand.Connection = dataConnection;
      datacommand.CommandText = "SELECT tblCodons.codonsFullName"
                     +" FROM tblCodons"
                     +" WHERE tblCodons.codonsCodon1="+letter;   

      OleDbDataReader dataReader = datacommand.ExecuteReader();
      dataReader.Read();
      fullname = dataReader.GetString(0);
      cdn = new Codons(fullname);

      toolTip1.SetToolTip(Convert.ToString(letter),"Name: "+fullname+" ("+cdn.GetCodon1()+")"
                          +"\n Begin: "+cdn.GetStart()+", End: "+cdn.GetEnd()+"");
    }
  }
}

【问题讨论】:

  • 顺便说一句,你能告诉我它抛出的警告信息是什么吗?
  • 你说“它在警告我这条线”;你能准确地添加警告信息吗?
  • 在你的 sql 语句中你没有在字母周围加上单引号,应该是 Where codonsCodon1 = '" + letter + "'"
  • 错误 2 'System.Windows.Forms.ToolTip.SetToolTip(System.Windows.Forms.Control, string)' 的最佳重载方法匹配有一些无效参数 C:\Projects_2012\Project_Noam\Project \myProject\myProject\AdProtein.cs 120 13 我的项目
  • @user1266429 该错误(不是警告)消息告诉您出了什么问题。看看the documentation for SetToolTip()

标签: c# winforms tooltip oledb


【解决方案1】:

SetToolTip 正在寻找一个 control 作为第一个参数。您正在提供Convert.ToString(letter)

第一个参数需要是你想要有工具提示的按钮:

toolTip1.SetToolTip(button1, "Name: " + fullname);

我猜您正在尝试设置 ToolTip 的标题,在这种情况下,这不是 SetToolTip 方法的一部分。您必须自己设置属性:

toolTip1.ToolTipTitle = Convert.ToString(letter);

如果您的 按钮 是这些字母,那么您将通过它们的名称来引用它们作为控制键:

  if (this.Controls.ContainsKey(Convert.ToString(letter))) {
    toolTip1.SetToolTip(this.Controls[Convert.ToString(letter)], "Name: " + fullname + " etc(";
  }

【讨论】:

  • 我正在尝试找到一种将字符串用作控件的方法。我该如何做到这一点并设置工具提示?
  • @user1266429 字符串作为控件? 我不知道那是什么意思。你是说你有一个名为“a”的按钮和一个名为“b”的按钮?如果是这样,我更新了答案。
  • 是的。(特别是 b 除外)。我正在尝试通过包含按钮名称的字符串(实际上是一个字符)来使用工具提示。
【解决方案2】:

您不应该为每个项目打开一个新的阅读器,您还缺少 where 子句中项目周围的单引号,但无论如何都不需要 where 子句\(^_^)_/

无论如何,这是我的解决方案。

private char _letter;

private string _fullName;

public char Letter{
get{
return _letter;
}
set{
_letter = value;
}
}
public string FullName{
get{
return _fullName;
}
set{
_fullName = value;
}
}

Private Void UpdateToolTipButton(){
string fullname;
codons cdn;
char letter;
OleDbConnection iConnect = new OleDbConnection();
iConnect.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data 
Source=@"C:\Projects_2012\Project_Noam\Access\myProject.accdb";

OleDbCommand iCommand = new OldDbCommand("Select * from  tblCodons",iConnect);
List<YourClassName> iList = new List<YourClassName>();

OleDbDataReader iRead = null;
iRead = iCommand.ExecuteReader();
while(iRead.Read()){
YourClassName iClass = new YourClassName();
iClass.Letter = Convert.ToChar(iRead["codonsCodon1"]);
iClass.FullName = Convert.ToString(iRead["codonsFullName"]);
iList.Add(iClass);
}
iConnect.Close();
iRead.Close();

foreach(var VarName in iList)
{
toolTip1.SetToolTip(button1, "Name: " + var.FullName);
toolTip1.ToolTipTitle = var.Letter;

}
}

【讨论】:

  • 啊,我假设他的.SetToolTip的语法是正确的,反正这只是一个清理,当你可以增加char时不需要创建int i,也不需要为每个打开一个阅读器for循环中的项目
  • 我不明白应该写什么而不是'YourClassName'。我在程序中只使用一个类;密码子
  • 好了,现在应该修复了。类名是假设你在一个类中编写了这个方法,我想如果你这样做了,你不能把 foreach 放在方法中,你会有使其返回列表并在您的 UI 应用程序中编写 foreach
【解决方案3】:

如果我没记错的话,您的表单有多个按钮,它们的 Text 属性设置为字母 a-z。问题是SetToolip 需要控件(按钮)作为其第一个参数才能设置其工具提示,但您正在传递按钮的文本值。

你的循环应该被安排成这样,这样你就可以遍历实际的按钮:

foreach (var button in GetButtons())
{
    if (ShouldSetTooltip(button)) 
    {
        // ...
        tooltip.SetTooltip(button, text);
    }
}

要将所有按钮放置在表单中(或面板上),您可以使用以下内容:

private IEnumerable<Button> GetButtons()
{
    // this is where you decide which buttons to return
    foreach (var c in this.Controls) // or panel1.Controls
        if (c is Button)
            yield return (Button)c;
}

然后您可能需要添加支票以跳过某些按钮名称:

private bool ShouldSetTooltip(Control c)
{
    string[] lettersToSkip = new string[] { "b","e","o","u","j","z" };
    return lettersToSkip.Contains(c.Text) == false;
}

[编辑]

如果你想通过它的Name属性获取控件(注意:这和Text属性不一样),你可以使用你的循环,这样写:

for (int i = 1; i <= 26; i++, letter++)
{
    ...
    var button = this.Controls[letter.ToString()];
    var txt = "Name: "+fullname+" ("+cdn.GetCodon1()+")"
              +"\n Begin: "+cdn.GetStart()+", End: "+cdn.GetEnd()+"";

    toolTip1.SetToolTip(button, txt);
}

【讨论】:

  • 我不明白“GetButtons”
  • @user1266429: GetButtons 遍历表单中的所有控件,并仅返回Button 类型的控件(您可能还有其他控件,标签,组合框等)。
  • @user1266429:好的,我编辑了我的答案。如果要通过名称获取控件,可以索引Controls 属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
  • 2016-05-22
  • 2014-10-09
  • 1970-01-01
  • 2020-09-02
  • 2023-03-10
  • 1970-01-01
相关资源
最近更新 更多