wpf 有没有办法在C#中为textBoxes.Text使用for循环?

wf82jlnq  于 2022-12-24  发布在  C#
关注(0)|答案(3)|浏览(245)

我有10个文本框(tb1,tb2,tb3,...),当我按下按钮时,10个文本框将根据用户输入的startingNum填充值,例如:10,按照10个文本框的顺序通过加法(+1,+2,+3,...)填充。
我的代码是工作,但有可能使用循环或任何更好的方式来改善我的代码?

private void genBtn_Click(object sender, EventArgs e)
{                        
    firstNum.Text = alphaBox.Text + (intFirst + 0).ToString();
    SecondNum.Text = alphaBox.Text + (intFirst + 1).ToString();
    thirdNum.Text = alphaBox.Text + (intFirst + 2).ToString();
    fourthNum.Text = alphaBox.Text + (intFirst + 3).ToString();
    fifthNum.Text = alphaBox.Text + (intFirst + 4).ToString();
    sixNum.Text = alphaBox.Text + (intFirst + 5).ToString();
    seventhNum.Text = alphaBox.Text + (intFirst + 6).ToString();
    eighthNum.Text = alphaBox.Text + (intFirst + 7).ToString();
    ninthNum.Text = alphaBox.Text + (intFirst + 8).ToString();
    tenthNum.Text = alphaBox.Text + (intFirst + 9).ToString();
}

rqcrx0a6

rqcrx0a61#

您的示例最好使用ListBox来实现。ListBox应该有一个UniformGrid,其中两列定义为panel。
因为要将每个TextBox与一个关联的标签一起显示,所以需要创建一个数据模型(例如MyDataModel)来保存这两个值。
然后创建绑定到ListBoxMyDataModel列表。ListBox随后将创建TextBoxTextBlock,以显示每个MyDataModel项的文本和标签。
要定义布局以及ListBox如何显示MyDataModel,必须创建一个DataTemplate
请注意,如果只显示文本,则应使用TextBlock
您可能需要阅读文档以学习所需的技能:

遵循以下示例的优点是它是完全动态的。元素的数量不是硬编码的。这大大减少了代码行。例如,当生成20个元素时,硬编码将需要编写20倍相同的代码。这是不可取的。除了这样的代码不可维护之外,您可能不想浪费时间编写这样的重复代码。

我的数据模型.cs

class MyDataModel : INotifyPropertyChanged
{
  public string TextValue { get; }
  public string Label { get; }

  public MyDataModel(string textValue, string label)
  {
    this.TextValue = textValue;
    this.Label = label;
  }
}

主窗口.xaml.cs

partial class MainWindow : Window
{
  public ObservableCollection<MyDataModel> MyDataModels { get; }

  public MainWindow()
  {
    InitializeComponent();
    this.DataContext = this;

    this.MyDataModels = new ObservableCollection<MyDataModel>();
  }

  private void genBtn_Click(object sender, EventArgs e)
  {  
    this.MyDataModels.Clear();

    // Dynamically create 20 TextBoxes aligned in two columns
    for (int count = 0; count < 20; count++)
    {
      string id = $"{this.intFirst + count}";
      string textValue = $"{this.alphaBox.Text}{id}";
      string label = $"#{id}";

      var newItem = new MyDataModel(textValue, label);
      this.MyDataModels.Add(newItem);
    }
  }
}

主窗口.xaml

<Window>
  <StackPanel>
    <Button Content="Generate"
            Click="genBtn_Click" />

    <ListBox ItemsSource="{Binding MyDataModels}">   
      <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
          <UniformGrid Columns="2" />
        </ItemsPanelTemplate>
      </ListBox.ItemsPanel>

      <ListBox.ItemTemplate>
        <DataTemplate DataType="{x:Type local:MyDataModel}">
          <StackPanel Orientation="Horizontal">        
            <TextBlock Text="{Binding Label}" />
            <TextBox Text="{Binding TextValue}" />
          </StackPanel>
        </DataTemplate>
      </ListBox.ItemTemplate>
    </ListBox>
  </StackPanel>
</Window>
ttcibm8c

ttcibm8c2#

也许您可以将它们放在数组或列表中,然后使用以下LINQ方法:

var allTextBoxes = new[]{firstNum, SecondNum, thirdNum, ... };
int intFirst = 10; // actually user input
allTextBoxes.Take(intFirst).Select((txt, index) => (txt, index)).ToList()
    .ForEach(x => x.txt.Text = alphaBox.Text + (intFirst + x.index).ToString());

当然,您应该只将TextBox添加到数组一次,而不是在此方法中。

xghobddn

xghobddn3#

您可以在文本框上循环执行以下操作:

int i=0;
foreach ( TextBox tb in this.Controls.OfType<TextBox>()) {
  tb.Text = alphaBox.Text + (intFirst + i).ToString();
  i++;
}

相关问题