|
네, 연결 및 연결 해제 부분을 제외한 코드를 작성해 드리겠습니다. 서버 정보 선택과 UI 업데이트에 초점을 맞춘 버전입니다.
```csharp
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Windows.Forms;
namespace ServerManager
{
// ConnectionManager 클래스 - INotifyPropertyChanged 구현
public class ConnectionManager : INotifyPropertyChanged
{
private readonly ServerConfigManager _serverConfigManager;
private FactoryModel _currentFactory;
private ServerModel _currentServer;
private string _statusMessage;
public ConnectionManager(ServerConfigManager serverConfigManager)
{
_serverConfigManager = serverConfigManager ?? throw new ArgumentNullException(nameof(serverConfigManager));
// 초기 선택 설정
if (_serverConfigManager.Servers?.Factories?.Count > 0)
{
CurrentFactory = _serverConfigManager.Servers.Factories[0];
if (CurrentFactory?.Servers?.Count > 0)
{
CurrentServer = CurrentFactory.Servers[0];
}
}
}
// 모든 서버 정보 (읽기 전용)
public FactoriesModel Servers => _serverConfigManager.Servers;
// 현재 선택된 팩토리
public FactoryModel CurrentFactory
{
get => _currentFactory;
set
{
if (_currentFactory != value)
{
_currentFactory = value;
[안내]태그제한으로등록되지않습니다-OnPropertyChanged();
// 팩토리가 변경되면 서버도 변경해야 함
if (_currentFactory?.Servers?.Count > 0)
{
CurrentServer = _currentFactory.Servers[0];
}
else
{
CurrentServer = null;
}
}
}
}
// 현재 선택된 서버
public ServerModel CurrentServer
{
get => _currentServer;
set
{
if (_currentServer != value)
{
_currentServer = value;
[안내]태그제한으로등록되지않습니다-OnPropertyChanged();
// 관련 속성들도 변경 알림
[안내]태그제한으로등록되지않습니다-OnPropertyChanged(nameof(ServerDisplayName));
[안내]태그제한으로등록되지않습니다-OnPropertyChanged(nameof(ConnectionString));
StatusMessage = _currentServer != null
? $"{_currentServer.Name} 서버가 선택되었습니다."
: "서버가 선택되지 않았습니다.";
}
}
}
// 서버 표시 정보
public string ServerDisplayName => _currentServer != null
? $"{_currentFactory?.Name} > {_currentServer.Name} ({_currentServer.Host}:{_currentServer.Port})"
: "선택된 서버 없음";
// 연결 문자열 (나중에 사용할 수 있도록)
public string ConnectionString => _currentServer?.ConnectionString;
// 상태 메시지
public string StatusMessage
{
get => _statusMessage;
private set
{
if (_statusMessage != value)
{
_statusMessage = value;
[안내]태그제한으로등록되지않습니다-OnPropertyChanged();
}
}
}
// INotifyPropertyChanged 구현
public event PropertyChangedEventHandler PropertyChanged;
protected void [안내]태그제한으로등록되지않습니다-OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
// MainForm 클래스의 핵심 로직
public partial class MainForm : Form
{
private ServerConfigManager _serverConfigManager;
private ConnectionManager _connectionManager;
public MainForm()
{
InitializeComponent();
// 서버 구성 관리자 초기화
_serverConfigManager = new ServerConfigManager();
// 서버 정보 로드 (구현 가정)
_serverConfigManager.LoadServers();
// 연결 관리자 초기화
_connectionManager = new ConnectionManager(_serverConfigManager);
// UI 초기화
InitializeUI();
// 이벤트 구독
_connectionManager.PropertyChanged += ConnectionManager_PropertyChanged;
}
private void InitializeUI()
{
// 팩토리 콤보박스 초기화
cboFactories.DataSource = _connectionManager.Servers?.Factories;
cboFactories.DisplayMember = "Name";
cboFactories.ValueMember = null;
cboFactories.SelectedItem = _connectionManager.CurrentFactory;
// 서버 콤보박스 업데이트
UpdateServerComboBox();
// 기타 UI 상태 업데이트
UpdateUIState();
}
private void UpdateServerComboBox()
{
// 서버 콤보박스 업데이트
if (_connectionManager.CurrentFactory != null)
{
cboServers.DataSource = _connectionManager.CurrentFactory.Servers;
cboServers.DisplayMember = "Name";
cboServers.ValueMember = null;
cboServers.SelectedItem = _connectionManager.CurrentServer;
cboServers.Enabled = true;
}
else
{
cboServers.DataSource = null;
cboServers.Enabled = false;
}
}
private void UpdateUIState()
{
// 서버 정보 표시
lblServerInfo.Text = _connectionManager.ServerDisplayName;
// 상태 메시지 업데이트
lblStatus.Text = _connectionManager.StatusMessage;
}
private void ConnectionManager_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
// UI 스레드에서 호출 보장
if (InvokeRequired)
{
Invoke(new Action(() => ConnectionManager_PropertyChanged(sender, e)));
return;
}
switch (e.PropertyName)
{
case nameof(ConnectionManager.CurrentFactory):
if (cboFactories.SelectedItem != _connectionManager.CurrentFactory)
{
cboFactories.SelectedItem = _connectionManager.CurrentFactory;
}
UpdateServerComboBox();
break;
case nameof(ConnectionManager.CurrentServer):
if (cboServers.SelectedItem != _connectionManager.CurrentServer)
{
cboServers.SelectedItem = _connectionManager.CurrentServer;
}
break;
case nameof(ConnectionManager.ServerDisplayName):
lblServerInfo.Text = _connectionManager.ServerDisplayName;
break;
case nameof(ConnectionManager.StatusMessage):
lblStatus.Text = _connectionManager.StatusMessage;
break;
}
}
// 팩토리 콤보박스 선택 변경 이벤트
private void cboFactories_SelectedIndexChanged(object sender, EventArgs e)
{
_connectionManager.CurrentFactory = cboFactories.SelectedItem as FactoryModel;
}
// 서버 콤보박스 선택 변경 이벤트
private void cboServers_SelectedIndexChanged(object sender, EventArgs e)
{
_connectionManager.CurrentServer = cboServers.SelectedItem as ServerModel;
}
}
// 참고: 모델 클래스들 (이미 있다고 가정하고 간략화)
public class FactoriesModel
{
public List<FactoryModel> Factories { get; set; } = new List<FactoryModel>();
}
public class FactoryModel
{
public string Name { get; set; }
public List<ServerModel> Servers { get; set; } = new List<ServerModel>();
}
public class ServerModel
{
public string Name { get; set; }
public string Host { get; set; }
public int Port { get; set; }
public string Username { get; set; }
public string Password { get; set; }
public string ConnectionString => $"Server={Host};Port={Port};User Id={Username};Password={Password};";
}
}
```
## 핵심 기능 설명
1. **ConnectionManager 클래스**:
- `INotifyPropertyChanged` 인터페이스 구현
- 팩토리 및 서버 선택 관리
- 속성 변경 시 알림 이벤트 발생
2. **계층적 선택 처리**:
- 팩토리 선택 변경 시 해당 팩토리의 서버 목록으로 업데이트
- 서버 선택 변경 시 `CurrentServer` 속성 업데이트
- 현재 선택된 서버 정보 표시 (ServerDisplayName)
3. **UI 동기화**:
- `PropertyChanged` 이벤트 구독을 통한 UI 자동 업데이트
- 콤보박스 선택 변경 시 CurrentFactory/CurrentServer 업데이트
- CurrentFactory/CurrentServer 변경 시 콤보박스 선택 업데이트
4. **상태 메시지**:
- 선택 변경 시 상태 메시지 업데이트
이 구현은 연결 및 연결 해제 관련 코드가 제거되었으며, 단순히 서버 정보를 선택하고 UI에 표시하는 데 초점을 맞추었습니다. ConnectionString 속성은 나중에 필요할 경우 사용할 수 있도록 유지했습니다.