1

だから、私はMySQLベースのプログラムを構築しています。整数から倍精度、日付、文字列に至るまで、多数のデータ列があり、UI とプログラミングの両方の観点から一貫性を保つために、テンプレート列からテーブル全体を作成することにしました。このシステムの重要なポイントは、ユーザーがセルを出るときに新しい情報をデータベースに自動的に送信する必要があることです。過去にこれに対応するために(他の受動的な問題があった場合)、選択された列と行を見つけ、座標を基礎となるデータテーブルに渡し、それを使用して更新文字列を作成し、それらをデータベースに更新しました(これは少し単純化しています)。

これは私を私の新しい問題に導きます。以前はテキスト列を使用していましたが、現在はテキスト ボックス (またはマスクされたテキスト ボックス) を含むテンプレート列を使用しています。テキスト列は、セルがクリックされたときに選択座標を取得するために、本質的にセル選択を処理しますが、テンプレート列はビジュアル ツリーをそれほど親切に処理せず、セルが選択されない限りコンテナー セルを選択しません。タブまたはその他の方法でナビゲートされますが、クリックされたときではありません。テキストボックスがクリックされたときにビジュアルツリーを手動で操作してセルを手動で選択しようとしましたが、役に立ちませんでした。奇妙な点は、スクロールして移動しなければならない列 (同じ列) をクリックするまで、プロセスが機能することです。この問題にアプローチする方法について何か提案はありますか? 私の XAML とコード ビハインドのサンプルを次に示します。

XAML:

<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);
    }
}

少し簡単に収まるようにすべてを単純化しようとしましたが、重要な部分は残しました。

4

1 に答える 1