【问题标题】:How to display the values from an app.config file如何显示 app.config 文件中的值
【发布时间】:2016-09-22 14:28:16
【问题描述】:

我有一个循环,当鼠标悬停在按钮上时,它会递增并显示递增数。每个按钮的值都存储在app.config 文件中。如何使用递增的值来显示正确的值名称?

当前代码

public void Controls()
{
    for (int i = 1; i <= Applications; i++)
    {
        string iconPath = ConfigurationManager.AppSettings["Application"+i+"_Icon"];
        Button button = new Button();

        this.Controls.Add(button);
        top += button.Height+25;
        button.Tag = i;
        button.MouseHover += Button_MouseHover;
        button.MouseLeave += Button_MouseLeave;
        button.Visible = true;

        button.Click += new EventHandler(button_Click);
   }

app.config:

 <appSettings>
  <add key="Applications" value="3" />

  <add key="Catergory" value="1"/>
  <add key="Application1_Name" value="word"/>
  <add key="Application1_Executable_Name" value="word.exe"/>
  <add key="Application1_AutoClose" value="true"/>
  <add key="Application1_Icon" value="C:\pictures\images.png"/>

   <add key="Catergory" value="1"/>
  <add key="Application2_Name" value="Paint"/>
  <add key="Application2_Executable_Path" value="C:\Windows\System32\"/>
  <add key="Application2_AutoClose" value="true"/>
  <add key="Application2_Icon" value="C:\pictures\images.png"/>


  <add key="Catergory" value="1"/>
  <add key="Application3_Name" value="notepad"/>
  <add key="Application3_Executable_Path" value="C:\Windows\"/>
  <add key="Application3_AutoClose" value="true"/>
  <add key="Application3_Icon" value="C:\pictures\images.png"/>

</appSettings>

目前,当我将鼠标悬停在按钮上时,它会显示值 1、2、3,但我希望它显示记事本、Word、Paint。

我尝试了什么

public void Controls()
{
        for (int i = 1; i <= Applications; i++)
        {
            NameValueCollection sAll;
            sAll = ConfigurationManager.AppSettings;

            Button button = new Button();

            this.Controls.Add(button);
            top += button.Height+25;
            button.Tag = i;

            foreach(string s in sAll.AllKeys)
            {
                button.Text = s + i ;
            }
        }
}

它的作用是向我显示 1,2,3 并为所有内容显示绘画。

【问题讨论】:

  • 您的所有密钥都命名为 Application1_Name?它们不应该是 Application1_Name、Application2_Name 和 Application3_Name
  • 是的,很抱歉就是这样,没有注意到我没有改变它,我很抱歉。我已经更新了我的问题
  • 您想在按钮上打印什么 - “Application1_Name”或“记事本”?
  • 必须显示记事本
  • 您的 app.config 错误,您有这么多键,您能告诉我您想在按钮上显示什么吗?

标签: c# app-config


【解决方案1】:

您的s 变量实际上是appSetting 键。您需要进一步传递此Key 以将相应的appSetting 值传递给ConfigurationManager.AppSettings

        NameValueCollection sAll;
        sAll = ConfigurationManager.AppSettings;

        foreach (string s in sAll.AllKeys)
        {
            var applicationNamevalue = sAll [s];//Just for demonstration, should combine these statements.
            button.Text = applicationNamevalue + i; //and set it as button text.
        }

@Shivang 的一个很好的建议,如果你真的不关心 key 的值,那么可以直接使用索引来获取配置值。

【讨论】:

  • 因为您已经拥有 sAll 中的所有键和值,因此您不应再次实例化它。在循环中。
  • @SHIVANGRANA - 感谢您的提示。更正:)
  • 嗨,它仍然向我显示 Application3_Name for all。我已经更新了我的配置文件,因此它可以显示整个视图
  • 查看我的回答,这将帮助你@doe
  • @doe - 这很奇怪 :(。这太简单了,无法正常工作。我已经测试过了,为我工作,可能更多细节会有所帮助。
【解决方案2】:

试试这个

string value = ConfigurationManager.AppSettings["Key"];

因此,对于您的情况,使用 NameValueCollection 中的值,而不是键

    button.Text = sAll[s] + i ;

【讨论】:

  • 我试过了,它什么也没显示,但它怎么知道值与增量匹配
  • 不要将key设置为文本,将value设置为文本。查看我的更新答案
  • 不需要另一个foreach循环。
  • 我没有使用另一个 foreach 循环。我只是修改他的循环。看不出来吗? @SHIVANGRANA
  • 兄弟,我只是在说这个循环。因为他的应用程序的 for 循环足以获取值。
【解决方案3】:

在您的应用配置文件中,更好、更简洁的方法是在这样的配置部分中添加应用名称

<configSections>
    <section name="ApplicationList" type="System.Configuration.NameValueSectionHandler" />
<configSections>

然后添加连接到配置部分的每个应用程序名称

<ApplicationList>
    <add key="1" value="Notepad"/>
    <add key="2" value="Word"/>
    <add key="3" value="Paint"/>
</ApplicationList>

然后就可以这样使用了

var applications = ConfigurationManager.GetSection("ApplicationList") as NameValueCollection;
for (int i = 0; i < applications.Count; i++)
{
   var applicationName = applications[i].ToString() ;
}

然后转到 Controls 函数中的逻辑:如果 totalApplication 获取所有当前应用程序,那么为什么要遍历 sAll.AllKeys 中的每个名称?

循环不应该这样编码

public void Controls()
  {
       var applications = ConfigurationManager.GetSection("ApplicationList") as NameValueCollection;
        for (int i = 0; i < applications.Count; i++)
        {
            var button = new Button();

            this.Controls.Add(button);
            top += button.Height+25;
            button.Tag = i;
            button.Text = applications[i].ToString();
        }
   }

【讨论】:

    【解决方案4】:

    由于您需要键的值,因此您应该在循环中执行以下操作。

    而且你不需要 foreach 循环。

    按照以下方法使用会有所帮助

    因为您使用的是 foreach 循环,这根本不是必需的。

    所以删除它,因为它会增加时间复杂度。

    如果您的 App.config 中有多个密钥,但您想获取其中一些,那么您应该为 Application_Name 指定格式,例如:

    • application_name1
    • application_name2
    • application_name3
    • application_name4

    然后在您的代码中执行以下操作,然后您只需将密钥添加到配置文件即可添加任意数量的按钮。

    public void Controls()
        {
                for (int i = 1; i <= Applications; i++)
                {
                    NameValueCollection sAll;
                    sAll = ConfigurationManager.AppSettings;
    
                    Button button = new Button();
    
                    this.Controls.Add(button);
                    top += button.Height+25;
                    button.Tag = i;
                    button.Text = sAll["application_name"+i] ;
                }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-16
      • 2012-03-02
      • 2010-09-15
      • 2014-03-19
      • 1970-01-01
      • 1970-01-01
      • 2010-11-24
      • 1970-01-01
      相关资源
      最近更新 更多