c# - 如何在 C# (WPF) 中动态链接复选框以启用文本框?

标签 c# wpf checkbox

我在网格中有一行包含 5 个文本框,其中 2 个由复选框启用。我试图在单击按钮时向网格动态添加额外的行。我添加的事件处理程序将仅启用第一行中的文本框,但不会启用当前行(第二行)中的文本框。还有另一个事件处理程序处理第一行中的框,这是一个新事件处理程序。 (顺便说一句,我只对第二行的一部分进行了编码)。不确定我是否应该尝试为复选框制作模板,然后使用绑定(bind)到文本框?如果是这样,我读到的有关连接绑定(bind)的说明是模糊且令人困惑的。还是直接绑定(bind)就可以了?或者?

 public partial class Window2 : Window
{
    int currentColumn = 0;
    int currentRow = 1;
    int timesCalled = 1;
    public Window2()
    {
        InitializeComponent();
    }               
    private void AddLevelButton_Click(object sender, RoutedEventArgs e)
    {
        string level = this.Level.Content.ToString();  //label for the row
        string[] splitLevel = level.Split(' ');
        int levelNum = int.Parse(splitLevel[1]);
        levelNum = timesCalled + 1;            
        int nextRow = currentRow + 1;           
        int nextColumn = currentColumn + 1;
        Label levelLabel = new Label();
        levelLabel.Content = "Level " + levelNum.ToString();          
        Grid.SetRow(levelLabel, nextRow);
        Grid.SetColumn(levelLabel, currentColumn);
        FlowGrid.Children.Add(levelLabel);
        currentColumn++;
        CheckBox antesBox = new CheckBox();   //the checkbox to enable the
        antesBox.Name = "AntesBox";           //textbox which follows
        antesBox.VerticalAlignment = VerticalAlignment.Bottom;
        antesBox.HorizontalAlignment = HorizontalAlignment.Right;
        antesBox.FontSize = 16;
        antesBox.Width = 20;
        antesBox.Height = 20;
        antesBox.Checked += AntesBox_Checked1;      //eventhandler
        Grid.SetRow(antesBox, nextRow);
        Grid.SetColumn(antesBox, currentColumn);
        FlowGrid.Children.Add(antesBox);
        nextColumn = ++currentColumn;
        TextBox enterAntes = new TextBox();      //the textbox to be enabled
        enterAntes.Name = "EnterAntes";
        enterAntes.Margin = new Thickness(5, 0, 5, 0);
        enterAntes.FontSize = 16;
        enterAntes.FontFamily = new FontFamily("Verdana");
        enterAntes.IsEnabled = false;       
        enterAntes.KeyDown += EnterAntes_KeyDown1;    //tested; this works
        Grid.SetRow(EnterAntes, nextRow);
        Grid.SetColumn(EnterAntes, nextColumn);
        FlowGrid.Children.Add(EnterAntes);
        nextColumn = ++currentColumn;

    }

    private void enterAntes_KeyDown1(object sender, KeyEventArgs e)
    {
        int key = (int)e.Key;
        e.Handled = !(key >= 34 && key <= 43 ||
         key >= 74 && key <= 83 || key == 2); 
    }

    private void AntesBox_Checked1(object sender, RoutedEventArgs e)
    {
        EnterAntes.IsEnabled = true;
    }

最佳答案

您需要添加以下代码来启用文本框。

以下是数据网格的 xaml View 。

<DataGrid x:Name="gvTest" AutoGenerateColumns="False" ItemsSource="{Binding}" HorizontalAlignment="Left" Margin="86,204,0,0" VerticalAlignment="Top" Height="132" Width="436">
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="TextBox 01">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBox x:Name="txt01" Width="50" Text="{Binding TxtBox01}"></TextBox>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="TextBox 02">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBox x:Name="txtbox02" Width="50" Text="{Binding TxtBox02}"></TextBox>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="TextBox 03">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBox x:Name="txtbox03" Width="50" Text="{Binding TxtBox03}"></TextBox>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="TextBox 04">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBox x:Name="txtbox04" Width="50" IsEnabled="False"  Text="{Binding TxtBox04}" Loaded="txtbox04_Loaded"></TextBox>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="TextBox 05">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBox x:Name="txtbox05" Text="{Binding TxtBox05}" Loaded="txtbox05_Loaded"></TextBox>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="Enable" >
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <CheckBox x:Name="chk01" Checked="chk01_Checked" IsChecked="{Binding IsActive}"></CheckBox>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

添加以下代码来声明所需文本框的实例并声明可观察集合。

TextBox txt04;
TextBox txt05;
ObservableCollection<TestItem> TestItemList = new ObservableCollection<TestItem>();

将以下代码添加到所需文本框的加载事件中。

private void txtbox04_Loaded(object sender, RoutedEventArgs e)
        {
            txt04 = (sender as TextBox);
            //txt04.IsEnabled = false;
        }

        private void txtbox05_Loaded(object sender, RoutedEventArgs e)
        {
            txt05 = (sender as TextBox);
        }

现在,使用以下代码段创建一个模型类,以便将值绑定(bind)到数据网格。

public class TestItem
    {
        public string TxtBox01 { get; set; }
        public string TxtBox02 { get; set; }
        public string TxtBox03 { get; set; }
        public string TxtBox04 { get; set; }
        public string TxtBox05 { get; set; }
        public bool IsActive { get; set; }
        public TestItem()
        {
            IsActive = false;
        }
    }

我使用了一个按钮将新行添加到数据网格。将以下代码添加到单击添加行按钮。

private void btnAdd_Click(object sender, RoutedEventArgs e)
        {
            TestItemList.Add(new TestItem());
            gvTest.ItemsSource = TestItemList;
        }

最后在复选框checked事件中添加以下代码

CheckBox c = (sender as CheckBox);
            if (c.IsChecked==true)
            {
                txt04.IsEnabled = true;
                txt05.IsEnabled = true;
            }

希望这可以帮助您满足您的要求。

关于c# - 如何在 C# (WPF) 中动态链接复选框以启用文本框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33381974/

相关文章:

javascript - 将 CheckBoxes 变成 CheckButtons

html - 复选框 当我点击另一个复选框时隐藏一个 div

c# - 执行 IOLE SetClientSite 时忽略 `WebBrowserShortcutsEnabled = false`

c# - 将参数传递给 Action 调度程序

c# - WPF TextBox Extension无法使用MahApps TextBoxHelper

c# - 所选文本未显示在 WPF 窗口中的 Windows 窗体 RichTextBox 控件中

c# - 自动完成导致崩溃

c# - 从 MVC4 中的 Authorize 属性捕获异常

wpf - 如何子类化 WPF 的 TreeViewItem 并在 treevview 中使用它

html - 设置为使用自定义设计隐藏时,复选框选项卡索引不起作用