【问题标题】:How can I get a value from a method I called? C#如何从我调用的方法中获取值? C#
【发布时间】:2018-12-11 12:55:01
【问题描述】:

我想从我调用的方法中获取字符串的值,这样我就可以使用 InnerHtml 创建一个列表。

这是一个示例代码。

protected void Button1_Click(object sender, EventArgs e)
{
    //MailBorrow();
    int count = 0;
    string[] names = new string[30];
    SqlCommand cmdgetnames = new SqlCommand("SELECT Distinct[names] FROM Employees", MyConN);
    using (SqlDataReader ReadeR = cmdgetnames.ExecuteReader())
        while (ReadeR.Read())
        {
            names[count] = ReadeR[0].ToString();
            count++;
        }
    foreach (string person in names)
    {
        Method(person);
        Sample.InnerHtml += **INEEDTHISBACK**;
    }
}
private void Method(string person)
{
    string html = "<h2>"+ person +",</h2>";
    SqlCommand cmdgetforPM = new SqlCommand("SELECT [tools] FROM Equipment WHERE owner = '" + person + "'", MyConN);
    using (SqlDataReader ReadeR = cmdgetforPM.ExecuteReader())
        while (ReadeR.Read())
        {
           html+= "<p>"+ Reader[tools].ToString() +"</p><br />"
        }
    **INEEDTHISBACK** = html;
}

我是新来的,如果您认为我的编码不好,请给我一些建议。 谢谢! :-)

【问题讨论】:

  • 另一个如何将数据、业务和表示层混合在一起的精彩示例。当我在几行代码中看到 html 和 SQL 时,我起鸡皮疙瘩。

标签: c# html asp.net innerhtml


【解决方案1】:

为什么不呢?将返回类型更改为string 并返回您生成的值。这里还有几点需要注意的是,

  • SQL 查询执行:- 您选择了执行查询的最差方法。利用参数化来执行此类串联查询。
  • 使用StringBuilder 代替字符串

修改后的方法如下所示:

private string Method(string person)
{
    StringBuilder htmlBuilder = new StringBuilder();
    string querySql ="SELECT [tools] FROM Equipment WHERE owner = @person"; 
    using (SqlCommand cmdSql = new SqlCommand(querySql, conObject))
    {
        cmdSql.Parameters.Add("@person", SqlDbType.VarChar).Value = person;
        using (SqlDataReader reader = cmdSql.ExecuteReader())
        {               
            htmlBuilder.Append("<h2>"+ person +",</h2>");
            while (reader.Read())
            {
                htmlBuilder.Append("<p>"+ reader[tools].ToString() +"</p><br />");
            }
        }
     }
     return htmlBuilder.ToString();
}

在调用方法中也可以使用stringBuilder代替字符串,从而避免连续修改innetHtml文本。调用方法的变化如下:

StringBuilder innerHtml = new StringBuilder();
foreach (string person in names)
{        
    innerHtml.Append(Method(person));
}
Sample.InnerHtml = innerHtml.ToString();

【讨论】:

  • 如果投反对票的人能够说明投票的原因,我可以让帖子变得更好
  • 您第一次提到使用StringBuilder 并在您使用字符串 concat 在循环中填充 InnerHtml 的所有内容下方有点奇怪。
  • @Corak - Nyerguds:感谢您发现错误,在帖子中进行了更改
【解决方案2】:

首先更改方法的签名以返回字符串

 private string Method(string person)
    {
        string html = "<h2>"+ person +",</h2>";
        SqlCommand cmdgetforPM = new SqlCommand("SELECT [tools] FROM Equipment WHERE owner = '" + person + "'", MyConN);
        using (SqlDataReader ReadeR = cmdgetforPM.ExecuteReader())
            while (ReadeR.Read())
            {
               html+= "<p>"+ Reader[tools].ToString() +"</p><br />"
            }
        return html;
    }

然后使用它:

Sample.InnerHtml += Method(person);

【讨论】:

    【解决方案3】:

    可以将它传递给另一个方法吗?

    Class.MyMethod(html);
    

    你的方法:

    public static string MyMethod(string input)
    {
        // do whatever here
        return input;
    }
    

    【讨论】:

      【解决方案4】:

      方法有一个返回类型。目前您的方法使用void,这意味着什么。将其替换为 string 并返回带有 return 关键字的 html。

      请阅读以下有关 C# 中 return 关键字的文档。

      https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/return

      【讨论】:

        【解决方案5】:

        另一种解决方案是使用 out 参数。

        【讨论】:

          猜你喜欢
          • 2016-03-27
          • 2012-04-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-04
          • 1970-01-01
          • 2010-09-28
          相关资源
          最近更新 更多