# aardio 范例: 网卡 DNS 修改工具（双击 DNS 修改）



```aardio
//RUNAS//设置网络连接
import win.ui;
/*DSG{{*/
var winform = win.form(text="网卡 DNS 修改工具（双击 DNS 修改）";right=1031;bottom=712)
winform.add(
edit={cls="edit";left=25;top=584;right=997;bottom=693;edge=1;multiline=1;z=2};
listview={cls="listview";left=24;top=27;right=996;bottom=555;edge=1;z=1}
)
/*}}*/

import win.ui.grid;
var grid = win.ui.grid(winform.listview);
grid.readonlyColums = { [1] = true ,[4] = true, [5] = true};//设置禁止编辑的列

winform.listview.insertColumn("IP",100)
winform.listview.insertColumn("主DNS",100)
winform.listview.insertColumn("辅DNS",100)
winform.listview.insertColumn("MAC",110)
winform.listview.insertColumn("网卡",-1) 

import com.wmi;
var loadNetworks = function(){
	
	var dataTable = {}
	dataTable.fields = {"ip";"dns1","dns2","mac","description"}
	
	//com.wmi.eachProperties 返回的是普通表而非 COM 对象
	for item in com.wmi.eachProperties("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled=true") {
		if(!item.DNSServerSearchOrder){
			continue; 
		}
		
		//https://docs.microsoft.com/en-us/windows/win32/cimwin32prov/win32-networkadapterconfiguration
		table.push(dataTable,{
			description = item.Description;
			ip = item.IPAddress[1];
			dns1 = item.DNSServerSearchOrder[1];
			dns2 = item.DNSServerSearchOrder[2];
			mac = item.MACAddress;
			settingId = item.SettingID;
		} ) 	
	}
	
	grid.setTable( dataTable );
	winform.listview.dataTable = dataTable;
} 

loadNetworks();

//编辑变更值会触发下面的事件
grid.onEditChanged = function(text,iItem,iSubItem){ 
	var dataTable = winform.listview.dataTable;
	var fieldName = dataTable.fields[iSubItem]
	var itemData = dataTable[iItem];
	
	var adapter = com.wmi.get("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE SettingID=@settingId",itemData);
	
	var err;
	if(fieldName === "dns1"){
		itemData.dns1 = text; 
		err = adapter.SetDNSServerSearchOrder({itemData.dns1,itemData.dns2}); 
			
	}
	else if(fieldName === "dns2"){
		itemData.dns2 = text; 
		err = adapter.SetDNSServerSearchOrder({itemData.dns1,itemData.dns2});  
	}
		
	//https://docs.microsoft.com/en-us/windows/win32/cimwin32prov/setdnsserversearchorder-method-in-class-win32-networkadapterconfiguration
	if(err==0){
		winform.edit.print("修改成功",itemData[fieldName],"-->",text);
	}
	else {
		winform.edit.print("修改失败，错误代码："+err,itemData[fieldName],"-->",text);
	}
	
} 

/*
用户点击列头排序时会触发下面的事件，
cloumn为例号，desc参数指定是否倒序，返回true允许当前列排序
*/
grid.onSortColumn = function(cloumn,desc){
	var dataTable = winform.listview.dataTable;
	var name = dataTable.fields[cloumn]
		
	if(desc){
		table.sort(dataTable,function(b){
			return time(owner[name]) < time(b[name])
		})	
	}
	else {
		table.sort(dataTable,function(b){
			return time(owner[name]) > time(b[name])
		})
	}
	
	grid.setTable( dataTable )
	return true;		
	
}

winform.show();
win.loopMessage();

```

