Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单击内容时,在模板列中选择DataGrid单元格_C#_Wpf_Datagrid_Datagridcell - Fatal编程技术网

C# 单击内容时,在模板列中选择DataGrid单元格

C# 单击内容时,在模板列中选择DataGrid单元格,c#,wpf,datagrid,datagridcell,C#,Wpf,Datagrid,Datagridcell,所以,我正在构建一个基于MySQL的程序。我有很多数据列,从整数到双精度,从日期到字符串,我刚刚决定用模板列创建整个表,以便在UI和编程透视图上保持一致性。该系统的关键在于,当用户退出单元格时,它需要自动向数据库发送新信息。为了适应过去的情况(我有其他被动问题),我只需定位已选择的列和行,将坐标传递给基础datatable,并使用该坐标创建更新字符串并将其更新到数据库(这有点简化) 这就引出了我的新问题。以前我使用的是文本列,现在我使用的是带有文本框(或屏蔽文本框)的模板列。文本列将在单击单元格

所以,我正在构建一个基于MySQL的程序。我有很多数据列,从整数到双精度,从日期到字符串,我刚刚决定用模板列创建整个表,以便在UI和编程透视图上保持一致性。该系统的关键在于,当用户退出单元格时,它需要自动向数据库发送新信息。为了适应过去的情况(我有其他被动问题),我只需定位已选择的列和行,将坐标传递给基础datatable,并使用该坐标创建更新字符串并将其更新到数据库(这有点简化)

这就引出了我的新问题。以前我使用的是文本列,现在我使用的是带有文本框(或屏蔽文本框)的模板列。文本列将在单击单元格时内在地进行单元格选择,以便获得选择坐标,而模板列不会像这样友好地在可视化树上工作,也不会选择容器单元格,除非单元格是选项卡式的或以其他方式导航到,但在单击到中时不会。我曾尝试在单击文本框时手动打开可视树来手动选择单元格,但没有成功。奇怪的是,这个过程一直在运行,直到我点击一列(这是相同的),我必须滚动到该列。 有人对如何解决这个问题有什么建议吗?下面是我的XAML和代码隐藏的示例

XAML:

我试图简化一切,使它更适合一点,但我留下了重要的部分。如果有人对如何完成这项工作有任何建议,我将不胜感激。

您可以使用

基本上,我们有一个“Model”类,它保存屏幕上显示并链接到单元格的实际数据。在setter中,您可以写入数据库

例如:

XAML:

如果您知道如何使用WPF及其数据绑定,那么您很少需要触发器和您在示例中尝试过的黑客。
第一次为DataGrid获得正确的绑定是相当棘手的,但一旦设置好,您的生活就会轻松得多

您可以在DataGridColumns中使用
,它们不必像我所展示的那样是
DataGridTextColumn
,但这是另一个问题。:)

您可能需要使用

基本上,我们有一个“Model”类,它保存屏幕上显示并链接到单元格的实际数据。在setter中,您可以写入数据库

例如:

XAML:

如果您知道如何使用WPF及其数据绑定,那么您很少需要触发器和您在示例中尝试过的黑客。
第一次为DataGrid获得正确的绑定是相当棘手的,但一旦设置好,您的生活就会轻松得多


您可以在DataGridColumns中使用
,它们不必像我所展示的那样是
DataGridTextColumn
,但这是另一个问题。:)

我是否正确理解您的
OnFocus
(自动选择行为)
事件未触发?我是否正确理解您的
OnFocus
(自动选择行为)
事件未触发?
<DataGrid x:Name="datagrid_1" PreviewMouseLeftButtonDown="UIElement_OnMouseLeftButtonDown1">
    <DataGrid.Columns>
        <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
        <xctk:MaskedTextBox LostFocus="textbox1_LostFocus" BorderBrush="Transparent" AutoSelectBehavior="OnFocus" Text="{Binding Path = penetration, Mode = TwoWay, ValidatesOnExceptions = true, NotifyOnValidationError = false, UpdateSourceTrigger = PropertyChanged}" Mask="000 %"  PromptChar=" " HidePromptOnLeave="True"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
    </DataGrid.Columns>
</DataGrid>
private void UIElement_OnLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    if (sender.GetType().ToString() == "TextBox")
    {
        var dep = (DependencyObject)e.OriginalSource;

        dep = VisualTreeHelper.GetParent(dep);

        if (dep == null)
        {
            return;
        }

        if (dep is DataGridCell)
        {
            datagrid_1.SelectedItems[0] = dep;
        }
    }
}

private void textbox1_LostFocus(object sender, RoutedEventArgs e)
{
    try
    {
        int rowindex = datagrid_1.Items.IndexOf(datagrid_1.SelectedCells[0].Item);                
        int columnindex = datagrid_1.SelectedCells[0].Column.DisplayIndex;
        string groupnumber = datatable1.Rows[rowindex][1].ToString();
        string columnname = datatable1.Columns[columnindex].ColumnName.ToString();
        string newinfo = datatable1.Rows[rowindex][columnindex].ToString();
        instantupdatecall(groupnumber, columnname, newinfo);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}
<DataGrid ItemsSource="{Binding Source=list}">
    <DataGrid.Columns>                
        <DataGridTextColumn Header="ID" Binding="{Binding ID}"/>
        <DataGridTextColumn Header="Date" Binding="{Binding Date}"/>
   </DataGrid.Columns>
</DataGrid>
public class SomeObject
{
    string id;
    DateTime date;
    public string ID
    {
        get { return id; }
        set {
            id = value;
            UpdateDB();
        }
    }
    public DateTime Date
    {
        get { return date; }
        set {
            date = value;
            UpdateDB();
        }
    }
    private void UpdateDB() {
        // Make some SQL, and work with your DB.
        // You maybe want to send arguments to this method about what has to be updated.
    }
}