[英]How to get the contents of the first cell of a row when double clicked on any column of a row in C# DataGrid
[英]Select DataGrid Cell in Template Column When Contents are Clicked
因此,我正在构建一个基于MySQL的程序。 我有许多数据列,范围从整数到双精度数,再到日期再到字符串,并且刚决定从Template Columns中创建整个表,以使其在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);
}
}
我试图简化所有内容以使其更容易使用,但是我保留了重要的部分。如果有人对如何进行此工作有任何建议,我将不胜感激。
您可能要使用数据绑定 。
基本上,有一个“模型”类,用于保存显示的实际数据并将其链接到屏幕上的单元格。 在设置器内部,您可以写入数据库。
例:
XAML:
<DataGrid ItemsSource="{Binding Source=list}">
<DataGrid.Columns>
<DataGridTextColumn Header="ID" Binding="{Binding ID}"/>
<DataGridTextColumn Header="Date" Binding="{Binding Date}"/>
</DataGrid.Columns>
</DataGrid>
C#:
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.
}
}
如果您知道如何使用WPF及其数据绑定,则几乎不需要触发器和在示例中尝试过的技巧。
第一次获得正确的DataGrid绑定是非常棘手的,但是一旦设置好,它会使您的生活变得更加轻松。
您可以在DataGridColumns中使用<DataTemplate>
,它们不必像我展示的那样是DataGridTextColumn
,但这是另一个问题。 :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.