Files
NewsCrawler/NewsForm.cs
mjjo 349de89a05 - Status bar 추가
- webview 삭제
- double click 시 브라우저로 이동
- Dart API 적용
- 종목명 검색 개선
2017-01-09 08:01:43 +09:00

674 lines
21 KiB
C#

using System;
using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace NewsCrawler
{
public partial class NewsForm : Form
{
class PRICE_CHECK_DATA
{
public int m_iID;
public CodeList.CODE_VALUE m_Code;
public int m_iPriceStart = 0;
public int m_iPriceLow = 0;
public int m_iPriceHigh = 0;
public DateTime m_StartTime;
public int m_iTryCnt = 0;
}
CybosHelper m_CybosHelper = null;
CodeList m_CodeList = null;
TextCondition m_Condition = null;
ConfigForm m_ConfigForm = null;
System.Timers.Timer m_CrawlTimer = new System.Timers.Timer();
int m_iCrawlInterval = 500;
bool m_bBuy = false;
System.Timers.Timer m_SystemTimer = new System.Timers.Timer();
ConcurrentQueue<PRICE_CHECK_DATA> m_PriceCheckList = new ConcurrentQueue<PRICE_CHECK_DATA>();
System.Timers.Timer m_PriceCheckTimer = new System.Timers.Timer();
delegate void InsertListView(string strTitle, string strName, string strCode, DateTime time, DateTime ResTime, string strURL, string strRef, double responseT, bool bInitial);
InsertListView m_InsertListViewDelegate = null;
Crawler m_Crawler = null;
float m_fSupplyContractRate;
object m_lvListLock = new object();
public NewsForm()
{
InitializeComponent();
Config.Init();
Util.SetLogView(tbLog);
m_CodeList = new CodeList();
m_Condition = new TextCondition();
m_CybosHelper = new CybosHelper(this);
m_Crawler = new Crawler(this);
m_fSupplyContractRate = Config.GetSupplyContractRate();
//MessageBox.Show("Keywords : \n\n" + m_Condition.GetKeywordsCnt());
m_InsertListViewDelegate = new InsertListView(this.InsertItem);
m_Crawler.ReadKIND(true);
m_Crawler.ReadDart(true);
m_Crawler.ReadEtoday(true);
m_Crawler.ReadEtoday2(true);
m_Crawler.ReadAsiaE(true);
m_Crawler.ReadEdaily(true);
m_Crawler.ReadMoneyToday(true);
m_Crawler.ReadFinancialNews(true);
lvList.Columns[chTime.Index].TextAlign = HorizontalAlignment.Right;
lvList.Columns[chResponseT.Index].TextAlign = HorizontalAlignment.Right;
lvList.Columns[chResT.Index].TextAlign = HorizontalAlignment.Right;
lvList.Columns[chId.Index].TextAlign = HorizontalAlignment.Right;
lvList.Columns[chPriceS.Index].TextAlign = HorizontalAlignment.Right;
lvList.Columns[chPriceLow.Index].TextAlign = HorizontalAlignment.Right;
lvList.Columns[chPriceLowP.Index].TextAlign = HorizontalAlignment.Right;
lvList.Columns[chPriceHigh.Index].TextAlign = HorizontalAlignment.Right;
lvList.Columns[chPriceHighP.Index].TextAlign = HorizontalAlignment.Right;
lvList.ListViewItemSorter = new ListViewItemComparer(chId.Index, SortOrder.Ascending);
lvList.Sorting = SortOrder.Ascending;
lvList.Sort();
if(lvList.Items.Count > 0)
{
lvList.Items[lvList.Items.Count - 1].Selected = true;
lvList.Select();
if(lvList.SelectedItems.Count > 0)
lvList.SelectedItems[0].EnsureVisible();
}
foreach(ColumnHeader col in lvList.Columns)
{
if(!(col == chPriceS || col == chPriceLow || col == chPriceHigh))
col.Width = -2;
}
m_CrawlTimer.Elapsed+=CrawlTimer_Tick;
m_CrawlTimer.Interval = m_iCrawlInterval;
m_CrawlTimer.Start();
m_SystemTimer.Elapsed+=SystemTimer_Elapsed;
m_SystemTimer.Interval=1000;
m_SystemTimer.Start();
m_PriceCheckTimer.Interval = 5000;
m_PriceCheckTimer.Elapsed += PriceCheckTimer_Elapsed;
m_PriceCheckTimer.Start();
Test();
}
void Test()
{
if(Util.IsDebugging() == false)
return;
Console.WriteLine(m_CodeList.SearchCode("\"사세요 일색 보고서\" 증권사 투자등급 공시 '"));
Console.WriteLine(m_CodeList.SearchCode("허서홍 GS에너지 상무, GS 보통주 5.1만주 매수"));
Console.WriteLine(m_CodeList.SearchCode("엠씨넥스, 아이클론 프리미엄 블랙박스 'i5 W"));
Console.WriteLine(m_CodeList.SearchCode("에스아이티글로벌, 김의서 대표이사 체제로 변"));
Console.WriteLine(m_CodeList.SearchCode("시몬스침대, 일산 가구공단에 프리미엄 매장 오"));
Console.WriteLine(m_CodeList.SearchCode("[유럽증시]美 고용지표 앞두고 짙은 관망세"));
Console.WriteLine(m_CodeList.SearchCode("코스콤, 강신 신임 전무이사 선임"));
Console.WriteLine(m_CodeList.SearchCode("[베스트리포트]원자현미경, 반도체의 질문에 답"));
Console.WriteLine(m_CodeList.SearchCode("거래소, 인콘에 최대주주 지분매각 추진설 조회"));
Console.WriteLine(m_CodeList.SearchCode("와이제이엠게임즈, 서울 강남구로 본점 이전"));
InsertItem("[test] 덕산하이메탈, 덕산네오룩스 66만여주 취득14:38", "", "", new DateTime(2016, 11, 30, 00, 00, 00), DateTime.Now, "http://www.asiae.co.kr/news/sokbo/sokbo_view.htm?idxno=2016112914371817318", "asiae", 0, false);
InsertItem("[test] 자연과환경, 12월15일~22일 주주명부폐쇄14:19", "", "", new DateTime(2016, 11, 30, 00, 00, 00), DateTime.Now, "http://www.asiae.co.kr/news/sokbo/sokbo_view.htm?idxno=2016112914193170301", "asiae", 0, false);
InsertItem("[test] 이엠코리아, 한국항공우주산업과 3억원 규모 공급계약14:06", "", "", new DateTime(2016, 11, 30, 00, 00, 00), DateTime.Now, "http://www.asiae.co.kr/news/sokbo/sokbo_view.htm?idxno=2016112914055964082", "asiae", 0, false);
InsertItem("[test] [특징주] 진원생명과학, 국외 AI 인체감염증...", "", "", new DateTime(2016, 11, 30, 00, 00, 00), DateTime.Now, "http://www.etoday.co.kr/news/sokbo/sokbo_view.htm?idxno=2016112914055964082", "이투데이", 0, false);
}
private void BuyItem(CodeList.CODE_VALUE Code)
{
if(m_bBuy == false)
return;
if((Code.m_enType & CodeList.CODE_TYPE.DENIAL) == CodeList.CODE_TYPE.DENIAL)
{
Util.Log(Util.LOG_TYPE.DENIAL, string.Format("거부종목 ({0})", Code));
return;
}
if((Code.m_enType & CodeList.CODE_TYPE.DUPLICATED) == CodeList.CODE_TYPE.DUPLICATED)
{
Util.Log(Util.LOG_TYPE.DUPLICATED, string.Format("중복종목 ({0})", Code));
return;
}
m_CybosHelper.Buy(Code, Config.GetBuyPrice());
m_CodeList.AddDuplicatedList(Code.m_strCode, Code.m_strName);
}
public void OnManualItemBuy(CodeList.CODE_VALUE Code)
{
BuyItem(Code);
}
void CheckPrice(int iID, CodeList.CODE_VALUE Code)
{
if(DateTime.Now.Hour < 9 || DateTime.Now.Hour >= 15)
return;
PRICE_CHECK_DATA CheckData = new PRICE_CHECK_DATA();
CheckData.m_iID = iID;
CheckData.m_Code = Code;
CheckData.m_StartTime = DateTime.Now;
m_PriceCheckList.Enqueue(CheckData);
}
void ProcessSearchAndBuy(string strTitle, string strName, string strCode, string strRef, int iID)
{
CodeList.CODE_VALUE Code = null;
if(strCode == "")
Code = m_CodeList.SearchCode(strTitle);
else
Code = m_CodeList.GetCode(strCode);
if(Code == null)
return;
TextCondition.RESULT MatchResult = m_Condition.Match(strTitle);
switch(MatchResult.m_enType)
{
case TextCondition.TYPE.NEGATIVE:
Util.Log(Util.LOG_TYPE.NEGATIVE, string.Format("[{0}] {1} (keyword:{2}, code:{3})", strRef, strTitle, MatchResult.m_strKeyword, Code.ToString()));
break;
case TextCondition.TYPE.POSITIVE:
if((Code.m_enType&CodeList.CODE_TYPE.DENIAL) == CodeList.CODE_TYPE.DENIAL)
Util.Log(Util.LOG_TYPE.DENIAL, string.Format("[{0}] {1} (keyword:{2}, code:{3})", strRef, strTitle, MatchResult.m_strKeyword, Code.ToString()));
else if((Code.m_enType&CodeList.CODE_TYPE.DUPLICATED) == CodeList.CODE_TYPE.DUPLICATED)
Util.Log(Util.LOG_TYPE.DUPLICATED, string.Format("[{0}] {1} (keyword:{2}, code:{3})", strRef, strTitle, MatchResult.m_strKeyword, Code.ToString()));
else if((Code.m_enType&CodeList.CODE_TYPE.MANUAL) == CodeList.CODE_TYPE.MANUAL)
{
Util.Log(Util.LOG_TYPE.MANUAL_CODE, string.Format("[{0}] {1} (keyword:{2}, code:{3})", strRef, strTitle, MatchResult.m_strKeyword, Code.ToString()));
ModelessPopup ManualPopup = new ModelessPopup(this);
ManualPopup.SetMessage(string.Format("{0}\n[{1}] {2}\n(keyword:{3}, code:{4})\n\n매수하시겠습니까?",
DateTime.Now.ToString("[hh:mm:ss]"),
strRef, strTitle, MatchResult.m_strKeyword, Code), Code);
ManualPopup.TopMost = true;
ManualPopup.Show();
}
else
{
Util.Log(Util.LOG_TYPE.POSITIVE, string.Format("[{0}] {1} (keyword:{2}, code:{3})", strRef, strTitle, MatchResult.m_strKeyword, Code.ToString()));
BuyItem(Code);
}
m_CodeList.AddDuplicatedList(Code.m_strCode, Code.m_strName);
break;
case TextCondition.TYPE.MANUAL:
Util.Log(Util.LOG_TYPE.MANUAL_KEYWORD, string.Format("[{0}] {1} (keyword:{2}, code:{3})", strRef, strTitle, MatchResult.m_strKeyword, Code.ToString()));
if(m_bBuy == true)
{
ModelessPopup ManualPopup = new ModelessPopup(this);
ManualPopup.SetMessage(string.Format("{0}\n[{1}] {2}\n(keyword:{3}, code:{4})\n\n매수하시겠습니까?",
DateTime.Now.ToString("[hh:mm:ss]"),
strRef, strTitle, MatchResult.m_strKeyword, Code), Code);
ManualPopup.TopMost = true;
ManualPopup.Show();
}
m_CodeList.AddDuplicatedList(Code.m_strCode, Code.m_strName);
break;
case TextCondition.TYPE.NOT_MATCHED:
Util.Log(Util.LOG_TYPE.DEBUG, string.Format("[NOT_MATCHED] [{0}] {1}({2})", strRef, strTitle, Code.ToString()));
break;
}
CheckPrice(iID, Code);
}
public void OnReceivedSupplyContract(string strCodeName, float fRate)
{
CodeList.CODE_VALUE Code = m_CodeList.GetCodeByName(strCodeName);
if(Code == null)
{
Util.Log(Util.LOG_TYPE.VERVOSE, string.Format("[공급계약체결] 종목을 찾을 수 없음({0}, {1}%", strCodeName, fRate));
return;
}
if(fRate < m_fSupplyContractRate)
{
Util.Log(Util.LOG_TYPE.VERVOSE, string.Format("[공급계약체결] 매출액 대비율 낮음({0}, {1}% / {2}%)", strCodeName, fRate, m_fSupplyContractRate));
return;
}
string strRef = "Dart API";
string strTitle = string.Format("공급계약체결 - {0} {1:n2}%", strCodeName, fRate);
if((Code.m_enType&CodeList.CODE_TYPE.DENIAL) == CodeList.CODE_TYPE.DENIAL)
Util.Log(Util.LOG_TYPE.DENIAL, string.Format("[{0}] {1}", strRef, strTitle));
else if((Code.m_enType&CodeList.CODE_TYPE.DUPLICATED) == CodeList.CODE_TYPE.DUPLICATED)
Util.Log(Util.LOG_TYPE.DUPLICATED, string.Format("[{0}] {1}", strRef, strTitle));
else if((Code.m_enType&CodeList.CODE_TYPE.MANUAL) == CodeList.CODE_TYPE.MANUAL)
{
Util.Log(Util.LOG_TYPE.MANUAL_CODE, string.Format("[{0}] {1}", strRef, strTitle));
ModelessPopup ManualPopup = new ModelessPopup(this);
ManualPopup.SetMessage(string.Format("{0}\n[{1}] {2}\n\n매수하시겠습니까?",
DateTime.Now.ToString("[hh:mm:ss]"),
strRef, strTitle), Code);
ManualPopup.TopMost = true;
ManualPopup.Show();
}
else
{
Util.Log(Util.LOG_TYPE.POSITIVE, string.Format("[{0}] {1}", strRef, strTitle));
BuyItem(Code);
}
m_CodeList.AddDuplicatedList(Code.m_strCode, Code.m_strName);
}
public void OnSupplyContractRateChanged(float fRate)
{
m_fSupplyContractRate = fRate;
Config.SetSupplyContractRate(fRate);
}
delegate bool IsDuplicatedURLDelegate(string strURL);
public bool IsDuplicatedURL(string strURL)
{
if(lvList.InvokeRequired)
{
lock(m_lvListLock)
return (bool)lvList.Invoke(new IsDuplicatedURLDelegate(IsDuplicatedURL), strURL);
}
else
{
lock(m_lvListLock)
return (strURL != "" && lvList.Items.Cast<ListViewItem>().Any(s => s.SubItems[chLink.Index].Text == strURL));
}
}
public void InsertItem(string strTitle, string strName, string strCode, DateTime time, DateTime ResTime, string strURL, string strRef, double responseT, bool bInitial)
{
try
{
if(this.InvokeRequired)
{
this.Invoke(m_InsertListViewDelegate, strTitle, strName, strCode, time, ResTime, strURL, strRef, responseT, bInitial);
}
else
{
if(IsDuplicatedURL(strURL) == true)
return;
int iID = lvList.Items.Count+1;
if(bInitial == false)
ProcessSearchAndBuy(strTitle, strName, strCode, strRef, iID);
lock(m_lvListLock)
{
lvList.Items.Add(new ListViewItem(new string[] {
iID.ToString(),
time.ToString("HH:mm:ss"),
ResTime.ToString("HH:mm:ss:fff"),
strRef,
strTitle,
string.Format("{0:0.0000} ms", responseT),
"",
"",
"",
"",
"",
strURL }));
}
if(bInitial == false)
lvList.Sort();
}
}
catch(Exception ex)
{
Util.Log(Util.LOG_TYPE.ERROR, ex.Message + Environment.NewLine + ex.StackTrace);
}
}
private void SystemTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
if(statusBar.InvokeRequired)
{
statusBar.BeginInvoke((MethodInvoker)delegate ()
{
statusBar.Items[3].Text = DateTime.Now.ToString("HH:mm:ss");
statusBar.Items[2].Text = m_CybosHelper.GetLimitRemainCountRQ().ToString();
statusBar.Items[0].Text = m_CybosHelper.IsConnected() ? "연결됨" : "연결끊김";
});
}
else
{
statusBar.Items[3].Text = DateTime.Now.ToString("HH:mm:ss");
statusBar.Items[2].Text = m_CybosHelper.GetLimitRemainCountRQ().ToString();
statusBar.Items[0].Text = m_CybosHelper.IsConnected() ? "연결됨" : "연결끊김";
}
}
private void CrawlTimer_Tick(object sender, EventArgs e)
{
m_CrawlTimer.Stop();
if(chAutoReload.Checked == true)
{
m_Crawler.ReadKIND();
m_Crawler.ReadDart();
m_Crawler.ReadDartAPI();
m_Crawler.ReadEtoday();
m_Crawler.ReadEtoday2();
m_Crawler.ReadAsiaE();
m_Crawler.ReadEdaily();
m_Crawler.ReadMoneyToday();
m_Crawler.ReadFinancialNews();
}
m_CrawlTimer.Interval = m_iCrawlInterval;
m_CrawlTimer.Start();
}
private void UpdateStartPrice(int iID, int iPrice)
{
if(lvList.InvokeRequired)
{
lvList.BeginInvoke((MethodInvoker)delegate ()
{
ListViewItem item = lvList.Items.Cast<ListViewItem>().FirstOrDefault(s => s.SubItems[chId.Index].Text == iID.ToString());
item.SubItems[chPriceS.Index].Text = iPrice.ToString("n0");
});
}
else
{
ListViewItem item = lvList.Items.Cast<ListViewItem>().FirstOrDefault(s => s.SubItems[chId.Index].Text == iID.ToString());
item.SubItems[chPriceS.Index].Text = iPrice.ToString("n0");
}
}
private void UpdateLowHighPrice(int iID, int iPriceStart, int iPriceLow, int iPriceHigh)
{
if(lvList.InvokeRequired)
{
lvList.BeginInvoke((MethodInvoker)delegate ()
{
ListViewItem item = lvList.Items.Cast<ListViewItem>().FirstOrDefault(s => s.SubItems[chId.Index].Text == iID.ToString());
item.SubItems[chPriceLow.Index].Text = string.Format("{0:n0}", iPriceLow);
float fLowRate = (iPriceLow-iPriceStart)*100/(float)iPriceStart;
item.SubItems[chPriceLowP.Index].Text = string.Format("{0:n}", fLowRate);
if(fLowRate > 0)
item.SubItems[chPriceLowP.Index].ForeColor = Color.Red;
else if(fLowRate < 0)
item.SubItems[chPriceLowP.Index].ForeColor = Color.Blue;
item.SubItems[chPriceHigh.Index].Text = string.Format("{0:n0}", iPriceHigh);
float fLowHigh = (iPriceHigh-iPriceStart)*100/(float)iPriceStart;
item.SubItems[chPriceHighP.Index].Text = string.Format("{0:n}", fLowHigh);
if(fLowHigh > 0)
item.SubItems[chPriceHighP.Index].ForeColor = Color.Red;
else if(fLowHigh < 0)
item.SubItems[chPriceHighP.Index].ForeColor = Color.Blue;
});
}
else
{
ListViewItem item = lvList.Items.Cast<ListViewItem>().FirstOrDefault(s => s.SubItems[chId.Index].Text == iID.ToString());
item.SubItems[chPriceLow.Index].Text = string.Format("{0:n0}", iPriceLow);
float fLowRate = (iPriceLow-iPriceStart)*100/(float)iPriceStart;
item.SubItems[chPriceLowP.Index].Text = string.Format("{0:n}", fLowRate);
if(fLowRate > 0)
item.SubItems[chPriceLowP.Index].ForeColor = Color.Red;
else if(fLowRate < 0)
item.SubItems[chPriceLowP.Index].ForeColor = Color.Blue;
item.SubItems[chPriceHigh.Index].Text = string.Format("{0:n0}", iPriceHigh);
float fLowHigh = (iPriceHigh-iPriceStart)*100/(float)iPriceStart;
item.SubItems[chPriceHighP.Index].Text = string.Format("{0:n}", fLowHigh);
if(fLowHigh > 0)
item.SubItems[chPriceHighP.Index].ForeColor = Color.Red;
else if(fLowHigh < 0)
item.SubItems[chPriceHighP.Index].ForeColor = Color.Blue;
}
}
private void PriceCheckTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
if(cbPriceCheck.Checked == false)
return;
m_PriceCheckTimer.Enabled = false;
DateTime CurTime = DateTime.Now;
foreach(PRICE_CHECK_DATA data in m_PriceCheckList)
{
if(data.m_iPriceStart == 0)
{
data.m_iPriceStart = m_CybosHelper.GetCurPrice(data.m_Code);
UpdateStartPrice(data.m_iID, data.m_iPriceStart);
}
else if(data.m_iPriceHigh == 0 && (CurTime - data.m_StartTime).Minutes >= 5)
{
m_CybosHelper.GetLowHighPrice(data.m_Code, data.m_StartTime, 5, out data.m_iPriceLow, out data.m_iPriceHigh);
data.m_iTryCnt++;
if(data.m_iPriceHigh > 0)
UpdateLowHighPrice(data.m_iID, data.m_iPriceStart, data.m_iPriceLow, data.m_iPriceHigh);
}
}
while(m_PriceCheckList.Count > 0)
{
PRICE_CHECK_DATA data;
if(m_PriceCheckList.TryPeek(out data) == false)
break;
if(data.m_iTryCnt < 3 && data.m_iPriceHigh == 0)
break;
m_PriceCheckList.TryDequeue(out data);
}
m_PriceCheckTimer.Enabled = true;
}
private void tbInterval_KeyPress(object sender, KeyPressEventArgs e)
{
if(e.KeyChar == Convert.ToChar(Keys.Enter))
{
m_iCrawlInterval = (int)(float.Parse(Regex.Replace(tbInterval.Text, @"\D\.", "")) * 1000);
if(m_iCrawlInterval < 1)
m_iCrawlInterval = 500;
tbInterval.Text = (m_iCrawlInterval / (float)1000).ToString("##0.0") + "초";
}
}
private void lvList_ColumnClick(object sender, ColumnClickEventArgs e)
{
SortOrder Order = (lvList.Sorting == SortOrder.Descending || lvList.Sorting == SortOrder.None) ? SortOrder.Ascending : SortOrder.Descending;
lvList.ListViewItemSorter = new ListViewItemComparer(e.Column, Order);
lvList.Sorting = Order;
lvList.Sort();
}
private void lvList_DoubleClick(object sender, EventArgs e)
{
if(lvList.SelectedItems.Count < 1)
return;
string strLink = lvList.SelectedItems[0].SubItems[chLink.Index].Text;
try
{
System.Diagnostics.Process.Start(strLink);
} catch
{
}
}
private void btnConfig_Click(object sender, EventArgs e)
{
if(m_ConfigForm == null)
m_ConfigForm = new ConfigForm(this);
FormCollection OpenForms = Application.OpenForms;
bool bOpen = false;
foreach(Form form in OpenForms)
{
if(form == m_ConfigForm)
{
bOpen = true;
break;
}
}
if(bOpen == false)
{
m_ConfigForm.Show();
}
else
{
m_ConfigForm.BringToFront();
}
}
public void OnConfigFormClosing()
{
m_ConfigForm = null;
}
public void OnManualCodeClick(int iPrice)
{
m_CodeList.MakeManualList(iPrice);
}
public void ApplyDenialCode()
{
m_CodeList.LoadDenialList();
}
public void ApplyDuplicatedCode()
{
m_CodeList.LoadDuplicatedList();
}
public void ApplyPositive()
{
m_Condition.LoadPositive();
}
public void ApplyManual()
{
m_Condition.LoadManual();
}
public void ApplyNegative()
{
m_Condition.LoadNegative();
}
public void ApplySynonym()
{
m_CodeList.LoadSynonym();
}
private void NewsForm_FormClosing(object sender, FormClosingEventArgs e)
{
Util.Clear();
}
private void chBuy_CheckedChanged(object sender, EventArgs e)
{
m_bBuy = chBuy.Checked;
if(m_bBuy == true && Config.GetAccount() == "")
{
chBuy.Checked = false;
MessageBox.Show("계좌를 선택해주시기 바랍니다");
return;
}
if(m_bBuy == true)
Util.Log(Util.LOG_TYPE.VERVOSE, "매수 시작");
else
Util.Log(Util.LOG_TYPE.VERVOSE, "매수 취소");
}
public string[] GetAccounts()
{
return m_CybosHelper.GetAccounts();
}
public void ApplyAccount(string strAccount, string strAccountSub)
{
Config.SetAccount(strAccount, strAccountSub);
}
}
class ListViewItemComparer : IComparer
{
int m_iColumn = 0;
SortOrder m_Order = SortOrder.Ascending;
public ListViewItemComparer(int column, SortOrder Order)
{
m_iColumn = column;
m_Order = Order;
}
public int Compare(object x, object y)
{
ListViewItem item1 = (ListViewItem)x;
ListViewItem item2 = (ListViewItem)y;
double num1;
double num2;
if(double.TryParse(item1.SubItems[m_iColumn].Text, out num1) &&
double.TryParse(item2.SubItems[m_iColumn].Text, out num2))
{
return (num1>num2)?1:-1;
}
else
{
if(m_Order == SortOrder.Ascending)
return string.Compare(item1.SubItems[m_iColumn].Text, item2.SubItems[m_iColumn].Text);
else
return string.Compare(item2.SubItems[m_iColumn].Text, item1.SubItems[m_iColumn].Text);
}
}
}
}