首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DataGrid的SelectedItem

DataGrid的SelectedItem
EN

Stack Overflow用户
提问于 2013-02-05 23:22:35
回答 4查看 703关注 0票数 3

我正在开发一个主机监控应用程序的用户界面,该应用程序已经在数据库级别上进行了监控。我已经在我的UI上显示了2个数据网格,它们将在run time.These上填充。两个数据网格通过HostID连接( HostID是LogDatagrid中的外键)。

第一个datagrid显示主机的列表及其状态(正在运行或已停止)。当用户想要详细了解状态时,我想显示相应HostID的日志状态。当用户在HostDatagrid中选择主机ID时,如何实现这一点?我已经添加了我的XAML和UI的屏幕截图。

XAML

代码语言:javascript
复制
 <DataGrid DataContext="{Binding Path=HostData,NotifyOnTargetUpdated=True,Mode=OneWay}" 
    AutoGenerateColumns="False" Name="hostDatagrid" Margin="171,32,235,230">
    <DataGrid.Columns>
    <DataGridTextColumn Header="Host" Width="auto" Binding="{Binding HostID}" />
     <DataGridTextColumn Header="Status" Width="auto" Binding="{Binding HostStatus}"/> 
     </DataGrid.Columns>
  </DataGrid>
 <DataGrid DataContext="{Binding Path=LogData,NotifyOnTargetUpdated=True,Mode=OneWay}"
   AutoGenerateColumns="False" Name="LogDatagrid" Margin="103,108,102,145">
    <DataGrid.Columns>
    <DataGridTextColumn Header="Host ID" Width="auto"  Binding="{Binding HostID}" />
    <DataGridTextColumn Header="Logs" Width="auto"  Binding="{Binding LogID}" />
    <DataGridTextColumn Header="Log Path" Width="auto"  Binding="{Binding LogPath}"/>
    <DataGridTextColumn Header="Date" Width="auto"  Binding="{Binding Date}"/>
    <DataGridTextColumn Header="Last Activity" Width="auto"  Binding="{Binding LastActivity}"/>
  </DataGrid.Columns>

LogFile模型的代码隐藏:

代码语言:javascript
复制
    public LogFileModel()
    {

    }
    private int _hostID;
    public int HostID
    {
        get { return _hostID; }
        set { _hostID= value; OnpropertyChanged("HostID"); }
    }

    private string _logid;
    public string LogID
    {
        get { return _logid; }
        set { _logid= value; OnpropertyChanged("LogID"); }
    }

    private string _logpath;
    public string LogPath
    {
        get { return _logPath; }
        set { _logPath = value; OnpropertyChanged("LogPath"); }
    }

    private DateTime _date;
    public DateTime Date;
    {
        get { return _date; }
        set { _date= value; OnpropertyChanged("Date"); }
    }

    private bool _activity;
    public bool LastActivity
    {
        get { return _activity; }
        set { _activity= value; OnpropertyChanged("LastActivity"); }
    }

LogFile ViewModel的代码隐藏:

代码语言:javascript
复制
    LogModel _myModel = new LogModel();
    private ObservableCollection<LogFileModel> _logFileData = new  ObservableCollection<LogFileModel>();
    public ObservableCollection<LogFileModel> LogFileData
    {
        get { return _logFileData; }
        set { _logFileData = value; OnPropertyChanged("LogFileData"); }
    }
   public LogFileViewModel()
    {
        initializeload();
        timer.Tick += new EventHandler(timer_Tick);
        timer.Interval = new TimeSpan(0, 0, 3);
        timer.Start();
    }

    ~LogFileViewModel()
    {
        Dispose(false);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (!disposed)
        {
            if (disposing)
            {
                timer.Stop();
                timer.Tick -= new EventHandler(timer_Tick);
            }
            disposed = true;
        }
    }

    private void timer_Tick(object sender, EventArgs e)
    {
        try
        {
            LogFileData.Clear();
            initializeload();
        }
        catch (Exception ex)
        {
            timer.Stop();
            Console.WriteLine(ex.Message);

        }
    }

    private void initializeload()
    {
        try
        {
            DataTable table = _myModel.getData();

            for (int i = 0; i < table.Rows.Count; ++i)
                LogFileData.Add(new LogFileModel
                {
                   HostID= Convert.ToInt32(table.Rows[i][0]),
                   LogID = table.Rows[i][1].ToString(),
                   LogPath = table.Rows[i][2].ToString(),
                   Date = Convert.ToDateTime(table.Rows[i][3]),
                   LastAcivity= table.Rows[i][4].ToString(),                   
                });
        }

        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propertyname)
    {
        var handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(propertyname));
    }

    public class LogModel
    {
        public DataTable getData()
        {
            DataTable ndt = new DataTable();
            SqlConnection sqlcon = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString);
            sqlcon.Open();
            SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM [LocalDB].[dbo].[LogFiles]", sqlcon);
            da.Fill(ndt);
            da.Dispose();
            sqlcon.Close();
            return ndt;
        }
    }
}

}

对于主机模型和ViewModel,我也遵循了相同的模式。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-02-05 23:40:20

您的代码视图模型中必须包含以下内容

将保存第一个DataGrid中的选定项的SelectedItem。包含所有主机的集合HostData。将显示特定主机日志的空收集日志数据

代码语言:javascript
复制
//populate with all your hosts and this will bind to your first datagrid
private ObservableCollection<HostModel> _hostData= new ObservableCollection<Host>();

public ObservableCollection<HostModel> HostData
{
    get { return _hostData; }
    set { _hostData= value; OnPropertyChanged("HostData"); }
}

//populate with all the logs for the selected item and bind this to your second datagrid
private ObservableCollection<LogFileModel> _logFileData = new ObservableCollection<LogFileModel>();

public ObservableCollection<LogFileModel> LogFileData
{
    get { return _logFileData; }
    set { _logFileData = value; OnPropertyChanged("LogFileData"); }
}

//when the user selects an item in the first datagrid this property will hold the value
//so you will bind it to the selected item property of your first datagrid
private Host _selectedHost; //initialise to avoid null issues

public HostModelSelectedHost
{
    get{ return _selectedItem; } 
    set 
    {
        //call a method to populate you second collection
        _selectedHost = value;
        logFileData = GetLogsForSelectedHost(_selectedHost);
        OnPropertyChanged("SelectedHost");
    { 
}

//the method for populating your second collection could look like this
private ObservableCollection<LogFileModel> GetLogsForSelectedHost(_selectedHost)
{
    ObservableCollection<LogFileModel> filteredLogs = new ObservableCollection<LogFileModel>;

    filteredLogs = //fill the collection with all the logs that match the host ID of
                   //your selected item
    return filteredLogs ;
}

我不能从你的代码中确定哪个类是哪个,但我希望上面的代码能告诉你如何做到这一点。

票数 2
EN

Stack Overflow用户

发布于 2013-02-05 23:34:43

这样做:

在您的主数据模型中创建一个名为search的方法。搜索有一个查询来搜索您的另一个数据库,该数据库保存数据日志并返回一个数据表。然后为您的主机状态数据网格添加一个CellClick侦听器方法,并执行类似下面的操作。我希望我没弄明白你需要什么。

代码语言:javascript
复制
private void hostDatagrid_CellClick(object sender, DataGridViewCellEventArgs e)
    {
        string cellValue = hostDatagrid[e.ColumnIndex,e.RowIndex].Value.ToString();
        LogFileViewModel logFileViewModel = new LogFileViewModel();
        DataTable table = logFileViewModel.search(cellValue);
        BindingSource bs = new BindingSource();
        bs.DataSource = table;
        logDataGrid.Datasource = table;
        logDataGrid.Update();
        logDataGrid.Refresh();
    }

   // and add this method to  LogFileViewModel



 public DataTable Search(string hostID)
    {
        DataTable ndt = new DataTable();
        SqlConnection sqlcon = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString);
        sqlcon.Open();
        SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM whatever WHERE hostid ="+hostID, sqlcon);
        da.Fill(ndt);
        da.Dispose();
        sqlcon.Close();
        return ndt;


    }
票数 1
EN

Stack Overflow用户

发布于 2013-02-05 23:47:38

1)将SelectedItemHost DataGrid绑定到ViewModel中的Host属性

代码语言:javascript
复制
SelectedItem = {Binding SelectedHost, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}

2)假设LogData是一个ObservableCollection,在SelectedHost属性的设置器中,更新LogData以显示Host的日志。

代码语言:javascript
复制
public Host SelectedHost {
    get;
    set {
        SelectedHost = value;
        UpdateLogData();
        OnPropertyChanged("SelectedHost");
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14710884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档