【问题标题】:How to access the textbox inside a datagrid column header in wpf?如何访问 wpf 中数据网格列标题内的文本框?
【发布时间】:2020-09-02 02:06:16
【问题描述】:

我是 WPF 的新手。因为我已在我的数据网格列标题中添加了一个文本框列以实现搜索功能。我无法访问项目中数据网格内的文本框名称。

我的 XAML:

<DataGrid  DataContext="{Binding Details}" Name="g1" ItemsSource="{Binding}"   >   
            <DataGrid.Columns>
               <DataGridTextColumn Binding="{Binding BrokerCode , UpdateSourceTrigger=PropertyChanged}"  HeaderStyle="{StaticResource CenterGridHeaderStyle}"  Header="Broker Code" x:Name="BrokerCode"  Width="100"  >
               <DataGridTextColumn.HeaderTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Vertical">
                                <Label VerticalAlignment="Center" HorizontalContentAlignment="Center" HorizontalAlignment="Center" Content="Broker Code" />
                                <TextBox x:Name="NameTextBox"  MinWidth="100"  TextChanged="SearchTextBox_TextChanged" Text="{Binding Filter, ElementName=mainwindow, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay }"/>    
                            </StackPanel>
                        </DataTemplate>
                    </DataGridTextColumn.HeaderTemplate>
                </DataGridTextColumn>
</Datagrid>

我的 C#:

  SqlConnection con = new SqlConnection();
            con.ConnectionString = 
              ConfigurationManager.ConnectionStrings["connEmployee"].ConnectionString;
               con.Open();           
                SqlCommand cmd = new SqlCommand();
                cmd.CommandText = "select BrokerCode from [SMAFI]";
                cmd.Connection = con;
                SqlDataAdapter adapter1 = new SqlDataAdapter(cmd);
                DataTable dt1 = new DataTable("SMAFI");
                var getdata = adapter1.Fill(dt1);
                List<Details> details = new List<Details>();
                details = (from DataRow row in dt1.Rows
                           select new Details()
                           {
                               BrokerCode = row["BrokerCode"].ToString()                                   
                           }).ToList();
                 g1.ItemsSource = details;
                  details = details.Where(x => 
                 x.BrokerCode.ToLower().StartsWith(NameTextBox.Text.ToLower())).ToList();
                 g1.ItemsSource = details;

我在后面的代码中编写了 textchange 事件,我想在我的 C# 中访问“NameTextBox”(文本框的名称)。请帮帮我。

【问题讨论】:

    标签: wpf filter datagrid controls datagridcolumnheader


    【解决方案1】:

    DataGridColumn.Header 接受任何类型的内容,甚至是其他控件。不要使用DataTemplate,只需将TextBox 直接放入列标题即可:

    <DataGrid DataContext="{Binding Details}" Name="g1" ItemsSource="{Binding}">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding BrokerCode , UpdateSourceTrigger=PropertyChanged}" HeaderStyle="{StaticResource CenterGridHeaderStyle}" x:Name="BrokerCode" Width="100">
                <DataGridTextColumn.Header>
                    <StackPanel Orientation="Vertical">
                        <Label VerticalAlignment="Center" HorizontalContentAlignment="Center" HorizontalAlignment="Center" Content="Broker Code" />
                        <TextBox x:Name="NameTextBox"  MinWidth="100" TextChanged="SearchTextBox_TextChanged" Text="{Binding Filter, ElementName=mainwindow, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
                    </StackPanel>
                </DataGridTextColumn.Header>
            </DataGridTextColumn>
        </DataGrid.Columns>
    </DataGrid>
    

    这将使您可以按名称访问TextBox。注意:只要您正确设置RelativeSource,绑定仍然可以使用DataTemplate 方法。

    【讨论】:

    • 非常感谢。它工作正常。非常感谢!!!!!!!!!!!!
    • @anjalinsneha Gald 来听听 :) 那么请accept my answer
    猜你喜欢
    • 2013-04-14
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 2015-12-20
    • 1970-01-01
    • 2015-09-20
    • 1970-01-01
    • 2014-10-20
    相关资源
    最近更新 更多