|
이해했습니다. 서버 선택 UI를 콤보박스가 아닌 그룹박스 내의 라디오버튼으로 변경하고, 서버를 A, B, C 세 가지 태그로 구분하는 방식으로 수정하겠습니다.
```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;
private string _selectedServerTag = "A"; // 기본값 A
public ConnectionManager()
{
// 서버 구성 관리자 직접 생성
_serverConfigManager = new ServerConfigManager();
// 초기 선택 설정
if (_serverConfigManager.Servers?.Factories?.Count > 0)
{
CurrentFactory = _serverConfigManager.Servers.Factories[0];
// 초기 A 태그 서버 선택
UpdateServerByTag(_selectedServerTag);
}
}
// 모든 서버 정보 (읽기 전용)
public FactoriesModel Servers => _serverConfigManager.Servers;
// 현재 선택된 팩토리
public FactoryModel CurrentFactory
{
get => _currentFactory;
set
{
if (_currentFactory != value)
{
_currentFactory = value;
[안내]태그제한으로등록되지않습니다-OnPropertyChanged();
// 팩토리가 변경되면 현재 선택된 태그로 서버 업데이트
UpdateServerByTag(_selectedServerTag);
}
}
}
// 현재 선택된 서버
public ServerModel CurrentServer
{
get => _currentServer;
set
{
if (_currentServer != value)
{
_currentServer = value;
[안내]태그제한으로등록되지않습니다-OnPropertyChanged();
// 관련 속성들도 변경 알림
[안내]태그제한으로등록되지않습니다-OnPropertyChanged(nameof(ServerDisplayName));
[안내]태그제한으로등록되지않습니다-OnPropertyChanged(nameof(ConnectionString));
StatusMessage = _currentServer != null
? $"{_currentServer.Name} 서버가 선택되었습니다."
: "서버가 선택되지 않았습니다.";
}
}
}
// 선택된 서버 태그 (A, B, C)
public string SelectedServerTag
{
get => _selectedServerTag;
set
{
if (_selectedServerTag != value && (value == "A" || value == "B" || value == "C"))
{
_selectedServerTag = value;
[안내]태그제한으로등록되지않습니다-OnPropertyChanged();
// 태그가 변경되면 서버 업데이트
UpdateServerByTag(_selectedServerTag);
}
}
}
// 태그 기반으로 서버 업데이트
private void UpdateServerByTag(string tag)
{
if (_currentFactory?.Servers == null)
{
CurrentServer = null;
return;
}
// 태그에 해당하는 서버 찾기
foreach (var server in _currentFactory.Servers)
{
if (server.Tag == tag)
{
CurrentServer = server;
return;
}
}
// 일치하는 태그가 없으면 첫 번째 서버 선택 (또는 null)
CurrentServer = _currentFactory.Servers.Count > 0 ? _currentFactory.Servers[0] : null;
}
// 서버 표시 정보
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 ConnectionManager _connectionManager;
public MainForm()
{
InitializeComponent();
// 연결 관리자 초기화
_connectionManager = new ConnectionManager();
// UI 초기화
InitializeUI();
// 이벤트 구독
_connectionManager.PropertyChanged += ConnectionManager_PropertyChanged;
}
private void InitializeUI()
{
// 팩토리 콤보박스 초기화
cboFactories.DataSource = _connectionManager.Servers?.Factories;
cboFactories.DisplayMember = "Name";
cboFactories.ValueMember = null;
cboFactories.SelectedItem = _connectionManager.CurrentFactory;
// 라디오 버튼 초기화
switch (_connectionManager.SelectedServerTag)
{
case "A": radServerA.Checked = true; break;
case "B": radServerB.Checked = true; break;
case "C": radServerC.Checked = true; break;
}
// 기타 UI 상태 업데이트
UpdateUIState();
}
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;
}
break;
case nameof(ConnectionManager.SelectedServerTag):
// 라디오 버튼 상태 업데이트
switch (_connectionManager.SelectedServerTag)
{
case "A": radServerA.Checked = true; break;
case "B": radServerB.Checked = true; break;
case "C": radServerC.Checked = true; break;
}
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 radServerA_CheckedChanged(object sender, EventArgs e)
{
if (radServerA.Checked)
{
_connectionManager.SelectedServerTag = "A";
}
}
private void radServerB_CheckedChanged(object sender, EventArgs e)
{
if (radServerB.Checked)
{
_connectionManager.SelectedServerTag = "B";
}
}
private void radServerC_CheckedChanged(object sender, EventArgs e)
{
if (radServerC.Checked)
{
_connectionManager.SelectedServerTag = "C";
}
}
}
// 참고: 모델 클래스들 (이미 있다고 가정하고 간략화)
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 Tag { get; set; } // A, B, C 태그 추가
public string ConnectionString => $"Server={Host};Port={Port};User Id={Username};Password={Password};";
}
}
```
## 주요 변경 사항
1. **ServerModel에 Tag 속성 추가**:
- 서버 모델에 "A", "B", "C" 태그를 구분할 수 있는 `Tag` 속성 추가
2. **ConnectionManager에 태그 기반 선택 기능 추가**:
- `SelectedServerTag` 속성 추가 (기본값 "A")
- `UpdateServerByTag` 메서드 추가: 현재 선택된 팩토리에서 지정된 태그를 가진 서버를 찾아 선택
3. **UI 변경**:
- 서버 콤보박스 대신 라디오버튼 그룹 사용
- 라디오버튼 체크 상태 변경 이벤트 핸들러 추가
- `ConnectionManager_PropertyChanged` 메서드에서 라디오버튼 상태 업데이트 로직 추가
4. **초기화 변경**:
- 초기 선택 시 태그 기반으로 서버 선택
이제 서버 선택이 콤보박스가 아닌 A, B, C 세 개의 라디오버튼으로 이루어지며, 각 버튼은 서버의 `Tag` 속성에 따라 해당 서버를 선택합니다.