首页 > 解决方案 > 将存储在列中的所有值显示到标签?

问题描述

我有一个名为的表和名为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();
}

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

标签: c#sqlwpf

解决方案


使用下面的查询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());

需要Label调用label1它才能工作。它尝试将 的结果写入saidConvert.ToString(com.ExecuteScalar())Content属性中Label

您还可以使用 a TextBlockand than 使用Text属性,所以这一行:

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

conne.Close();请注意,我没有手动调用,而是SqlConnection conne将.usingIDisposable

您可以在此处阅读有关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();

如果您没有IEnumerableofint而是 a 而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);
    }
}

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

要保留参考更改此行

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字段只会被初始化一次。如果您想在MyProperty每次Btn_LeaderB_Click调用该方法时增加该值,您可以进一步将其扩展为:

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

推荐阅读