【问题标题】:Check a large group of checkboxes检查一大组复选框
【发布时间】:2015-11-24 19:05:58
【问题描述】:

我想能够说:

获取第一个文本块,然后是第一个复选框,它们的名称中都带有数字 1。

如果复选框被选中,则可以填充文本块。

见代码:

     for (int i = 1; i < 10; i++)
        {

            TextBlock a = (this.FindName(string.Format("tb_{0}", i)) as TextBlock);
            CheckBox b = (this.FindName(string.Format("ck_{0}", i)) as CheckBox);
            if (b.IsChecked.HasValue)
            {
            if (a != null) a.Text = data.ArrayOfSensors[i].ToString();
            }
            else
            {
                if (a != null) a.Text = data.ArrayOfSensors[0].ToString();
            }

        }

所以当复选框被启用时,文本块将使用数组中的索引填充。

非常感谢!

编辑:更好的解释:

文本块被命名为:tb_1、tb_2 等

复选框被命名为:cb_1、cb_2 等

数组是:

[0] 0

[1] 100

[2] 150

数字是他们的共同点。所以我可以使用一个 for 循环,其中 i 作为每个循环的公共变量。我还有大约 50 个文本框和组合框,不想单独写出每一个。

编辑:我的组合框和文本块是在 Xaml 代码上创建的,如下所示:

   <CheckBox x:Name="Cb_1" Width="15" Height="15" Margin="349,53,127,164" IsChecked="True" />

   <TextBlock x:Name="tb_1" Text="80" Height="20" Width="20" Margin="266,35,205,177" />

【问题讨论】:

  • “获取第一个文本块,然后是第一个复选框,名称中都带有数字 1。在您的问题中”是什么意思?
  • 那么疯狂的事情的目标是什么? :)
  • 为你们添加了编辑! :)

标签: c# wpf xaml checkbox


【解决方案1】:

如果不看你的 XAML 是什么样子就很难回答,但听起来你可能正在尝试像 WinFirms 一样使用 WPF。

要在 WPF 中构建这样的接口,您应该首先创建一个自定义类来保存您的数据,然后使用 ItemsControl 来呈现您的数据集合。

例如,您的班级可能看起来像这样

public class SensorData() : INotifyPropertyChanged
{
    // should implement INotifyPropertyChanged of course
    public string Text { get; set; }
    public bool IsChecked { get; set; }
}

ObservableCollection&lt;SensorData&gt; 可能会使用&lt;ItemsControl&gt; 和包含CheckBoxTextBoxItemsPanelTemplate 来呈现

<ItemsControl ItemsSource="{Binding MyCollectionOfSensorData}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <CheckBox Checked="{Binding IsChecked}" />
                <TextBlock Text="{Binding Text}" />
            </StackPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

这将遍历SensorData 对象的集合,并为每个对象呈现一个CheckBox 和TextBox。如果您想对代码隐藏中的数据进行任何操作,只需修改SensorData 对象的属性即可。

例如,你可以有一个循环

for (int i = 0; i < MyCollectionOfSensorData.Length; i++)
{
    SensorData item = MyCollectionOfSensorData[i];

    if (item.IsChecked)
        item.Text = data.ArrayOfSensors[i].ToString();
    else
        item.Text = "0";
}

而且根本不会与 UI 对象交互。

【讨论】:

  • 我没有那样做。我生成了一个随机数,然后填充数组。然后从那里将其输入到 ui 中。见编辑! :)
  • @TomPitts 正如 Rachel 所说,您正在尝试像 WinForms 一样使用 WPF ......这不好。
  • 对于这个项目,我必须使用 WPF。我只想说一个简单的方法,如果文本块和组合框名称都以 1 结尾并且组合框被选中,那么文本块显示来自数组位置 [1] 的文本。将它包装在一个 for 循环中,这样我就可以通过每个文本块和组合框运行它,所以接下来是 2,对于数组中的每个位置,依此类推。
  • @TomPitts .FindName 默认返回 object 的数据类型,因此您希望将其转换为 CheckBox 以访问 CheckBox 特定的属性。您问题代码中使用的语法 (CheckBox b = (this.FindName(string.Format("ck_{0}", i)) as CheckBox)) 的意思是“创建一个 CheckBox 类型的变量,将其命名为 b,并尝试将 .FindName 的结果解析到其中。如果此解析失败,请为其分配一个值空值”。通常你应该在使用之前检查b != null,以避免NullReferenceException
  • @TomPitts 很高兴这对你有用~如果你继续在 WPF 中编程,我强烈建议学习 MVVM 设计模式以配合它。它是 WPF 开发的标准,使编码和维护变得更加容易:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多