【问题标题】:Display all values stored in a column to a label?将存储在列中的所有值显示到标签?
【发布时间】:2019-10-02 09:14:13
【问题描述】:

我有一个名为T_Score 的表和名为Team1 的列,它有一些存储值,我希望将这些值添加并显示在标签上。

这是将值存储在表中的代码:

private void Btn_LeaderB_Click(object sender, RoutedEventArgs e)
{
    this.NavigationService.Navigate(new LeaderBoard());

    SqlConnection conne = new SqlConnection(@"Data Source=LAPTOP-S2J1U9SJ\SQLEXPRESS;Initial Catalog=Unit4_IT;Integrated Security=True");

    conne.Open();
    string insertQuery = "insert into T_Score(Team1) " +
         "values(@Team1)";
    SqlCommand com = new SqlCommand(insertQuery, conne);

    com.Parameters.AddWithValue("@Team1", txt_score4_tm1.Text);

    com.ExecuteNonQuery();
    conne.Close();
}

此代码存储需要与前一个值相加的值。

【问题讨论】:

  • 您面临的问题是什么,到目前为止您尝试过什么?
  • @Twenty 我不知道如何真正接近它,但我猜需要使用 SUM。
  • 如果我们也有值的数据类型会有所帮助。
  • 您需要 1) 添加值,2) 从数据库返回数据,3) 将其显示在标签中。 (1 & 2 可以按任意顺序完成)。哪一点给你带来了困难?
  • @Twenty 它的整数。

标签: c# sql wpf


【解决方案1】:

使用下面的查询select sum(Team1) from T_Score; 而不是cmd.ExecuteNonQuery(); 使用cmd.ExecuteScalar(); 并使用方法的返回值ExecuteScalar

https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlcommand.executescalar

像这样:

private void WriteToLabel()
{    
    using (SqlConnection conne = new SqlConnection(@"Data Source=LAPTOP-S2J1U9SJ\SQLEXPRESS;Initial Catalog=Unit4_IT;Integrated Security=True"))
    {
        conne.Open();
        string selectQuery = "select sum(Team1) from T_Score;";
        using (SqlCommand com = new SqlCommand(selectQuery, conne))
            label1.Content = Convert.ToString(com.ExecuteScalar());
    }
}

线

label1.Content = Convert.ToString(com.ExecuteScalar());

需要一个名为label1Label 才能工作。 它尝试将Convert.ToString(com.ExecuteScalar()) 的结果写入上述LabelContent 属性中。

您也可以使用TextBlock 而不是使用Text 属性,所以这一行:

textBlock1.Text = Convert.ToString(com.ExecuteScalar());

注意,我没有手动调用conne.Close();,而是将SqlConnection conne 包装到using 语句中,这应该始终使用从IDisposable 继承的对象。

您可以在此处阅读IDisposableusing 声明:


如果您的值已经在 IEnumerable 对象中,例如。 List<int> 你可以做以下事情

用一个简单的循环:

var myValues = new List<int>() { 1, 2, 3, 4, 5, 6 }; //<- list with temporary data
var sumOfValue = 0;
foreach (var myValue in myValues)
     sumOfValue += myValue;

LINQ:

var myValues = new List<int>() { 1, 2, 3, 4, 5, 6 }; //<- list with temporary data
var sumOfValue = myValues.Sum();

如果您没有 IEnumerableint 而是 class,那么您的代码将如下所示

public class MyValue
{
    public int Value { get; set; }
    //other properties
}

var myValues = new List<MyValue>() 
               { 
                   new MyValue() { Value = 1 }, 
                   new MyValue() { Value = 2 }, 
                   new MyValue() { Value = 3 }, 
                   new MyValue() { Value = 4 }, 
                   new MyValue() { Value = 5 }, 
                   new MyValue() { Value = 6 }, 
               }; //<- list with temporary data

用一个简单的循环:

var sumOfValue = 0;
foreach (var myValue in myValues)
     sumOfValue += myValue.Value;

LINQ:

var sumOfValue = myValues.Sum(x => x.Value);

在所有这些情况下,您都必须像这样将sumOfValue 写入您的LabelTextBlock

//Label
label1.Content = sumOfValue.ToString();
//or TextBlock
textBlock1.Text = sumOfValue.ToString();

要将值传递到不同的页面,您只需执行以下操作。

在后面的代码中搜索您的页面,例如。 LeaderBoard。 它应该看起来像这样

public partial class LeaderBoard : Page
{
    //stuff...
}

向这个类添加一个新属性

public partial class LeaderBoard : Page
{
    public int MyProperty { get; set; }
    //stuff...
}

当您初始化 LeaderBoard 例如。这里

this.NavigationService.Navigate(new LeaderBoard());

把初始化改成这样:

this.NavigationService.Navigate(new LeaderBoard() { MyProperty = 7187, });

7187 是一个随机数,需要填写您需要的任何内容。

有了这个,您已经将数据“传输”到LeaderBoard,并且可以在LeaderBoard 中访问具有其值的新属性,例如。可能有这样的方法

public void Foo()
{
    textBlock1.Text = Convert.ToString(this.MyProperty);
}

这个类应该是这样的:

public partial class LeaderBoard : Page
{
    public int MyProperty { get; set; }
    //stuff...

    public void Foo()
    {
        textBlock1.Text = Convert.ToString(this.MyProperty);
    }
}

如果您需要在 LeaderBoard 打开时从其他位置更改 MyProperty,请保留您创建的引用。

为了保持引用改变这一行

this.NavigationService.Navigate(new LeaderBoard() { MyProperty = 7187, });

到这里

_leaderBoard = new LeaderBoard() { MyProperty = 7187, };
this.NavigationService.Navigate(_leaderBoard);

并像这样在外部范围内创建Field

private LeaderBoard _leaderBoard; //<- needs to be outside the method

private void Btn_LeaderB_Click(object sender, RoutedEventArgs e)
{
    _leaderBoard = new LeaderBoard() { MyProperty = 7187, };
    this.NavigationService.Navigate(_leaderBoard);
}

如果Btn_LeaderB_Click 被多次调用,但您只想创建 1 个排行榜,您可以这样做:

private void Btn_LeaderB_Click(object sender, RoutedEventArgs e)
{
    if (_leaderBoard == null)
        _leaderBoard = new LeaderBoard() { MyProperty = 7187, };

    this.NavigationService.Navigate(_leaderBoard);
}

这样_leaderBoard 字段只会被初始化一次。 如果您想在每次调用Btn_LeaderB_Click 方法时增加MyProperty 的值,您可以进一步将其扩展为:

private void Btn_LeaderB_Click(object sender, RoutedEventArgs e)
{
    if (_leaderBoard == null)
        _leaderBoard = new LeaderBoard() { MyProperty = 7187, };
    else
        _leaderBoard.MyProperty += int.Parse(txt_score4_tm1.Text);

    this.NavigationService.Navigate(_leaderBoard);
}

【讨论】:

  • 为什么 Text 给我一个错误和 insertQuery 或者我想改变它
  • 是 insertquery 假设是 selectquery
  • 它几乎可以工作,只是没有加上列中的值。
  • @MarkMihailovs - 编辑了我的答案以澄清label1.Text 并使用insertQuery 修复了复制和粘贴错误。
  • @MarkMihailovs - 关于我的代码不产生总和的问题,这不可能是因为SQL 查询中的sum(Team1) 将对@987654389 中的所有值求和@ 柱子。确保正确的值在数据库中。例如。使用 SQL Server Management Studio (docs.microsoft.com/en-us/sql/ssms/…) 连接到您的数据库并查看表中的值 T_Score
猜你喜欢
  • 2017-01-11
  • 2014-11-25
  • 2019-12-02
  • 1970-01-01
  • 2020-01-15
  • 2013-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多